我可能会对遗留项目进行一些交叉编译,并且在最近的JDK中我注意到,对于source
、target
和release
JVM参数,我们仅限于一些特定的版本。
如何获得这些参数的支持版本?
实际上,支持的值取决于所使用的主要JDK版本。
您可以找到相应主要JDK版本的javac
文档的信息(下面引用了这些链接)。
关于这些论点的一些一般性说明:
>
Maven配置中的源
和目标
版本不应优于所使用的JDK版本。
旧版本的JDK不能用新版本进行编译,因为它不知道其规范。
注意:虽然最近的JDK可以接受编译较旧的Java版本作为source
,但这并不意味着您可以选择任何受支持的最近版本作为source
,并且选择任何已记录为受支持的较旧版本作为target
(见下文)。
实际上,Java版本可能会引入新的功能,这些功能在编译时/运行时不是为了与较旧的Java版本兼容而设计的。
例如,JDK 11可以编译具有8个source
编译器版本的类。如果还选择8作为目标
编译器版本,编译就会通过。
但是如果您改变了主意,并且您想用11作为源
而8作为目标
进行编译,编译就会失败。
这并不总是在javac文档中显式记录的。
Java9中存在release
参数。
由于source
和target
是相同的,因此release
参数应该优于source
和target
。它的指定更短,它确保了更好的交叉编译兼容性,即使你不做交叉编译,它也不会受到伤害。
更多的解释,请参考这个优秀的答案。
源/目标/版本支持的版本:
对于Java 7
源
:1.3、1.4、1.5(也是5)、1.6(也是6)和1.7(也是7)。
目标
:1.1、1.2、1.3、1.4、1.5(也是5)、1.6(也是6)、1.7(也是7)。
1.3、1.4、1.5(也是5)、1.6(也是6)、1.7(也是7)和1.8(也是8)。
目标
:1.1、1.2、1.3、1.4、1.5(也是5)、1.6(也是6)、1.7(也是7)和1.8(也是8)。
目标
:1.6(也是6)、1.7(也是7)、1.8(也是8)和9。
版本
:1.6(也是6)、1.7(也是7)、1.8(也是8)、9和10。
目标
:1.6(也是6)、1.7(也是7)、1.8(也是8)、9和10。
对于Java 11
源/目标/发布
:6、7、8、9、10和11。
问题内容: 我想将我的.java(几个)编译成至少与Java 兼容的,较新的(最好是较新的)版本。(我有) 问题答案: 是的,您可以在编译时设置编译器的版本。并将您的Java代码编译为Java的旧版本。 从Oracle文章:http : //docs.oracle.com/javase/1.5.0/docs/tooldocs/windows/javac.html 交叉编译示例 在这里,我们使用ja
我在maven-compiler-plugin的pom.xml中有以下配置。 JDK的源版本和目标版本应该是什么?它如何依赖于安装在我的计算机上的jdk版本?他们可能不一样吗?例如,安装的jdk是1.8,在源参数-1.6,目标-1.7中。
JUnit 5在运行时需要Java 8(或更高版本)。当然,您仍然可以测试使用以前版本的JDK编译的代码。
我想将我的.java(几个)编译成一个,该至少兼容和更新版本,最好是和更新版本的Java。(我有)
我是科特林的初学者。我在执行以下操作时出现以下异常: 线程“main” java.lang.UnsupportedClassVersionError中的异常:org/jetbrains/kotlin/preloading/Preloader : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Na
问题内容: 如果我有一个已编译的Java类,是否可以仅从类文件中知道其目标版本兼容性是什么?具体来说,我有许多编译成Java 6的类文件,它们在Java 5下运行,并显示“无法识别的版本”错误。我希望能够在不运行JVM的情况下查看类文件并查找其目标版本兼容性。有任何想法吗? 问题答案: 我已经在网上找到了它并且可以使用。 每个“ .class”文件都以以下内容开头: 幻数[4字节] 版本信息[4字