我发布这个问题是因为我自己测试或确认的资源有限。问题陈述:我有一个使用java1.6的旧的自定义Jar。我们也没有源代码。为了解决其中一个问题,我们使用7-zip更新了这个jar的2.class文件。代码更改只是为了用更有意义的消息更新现有的记录器。这些2.class文件是用java1.7。现在的问题是,这个jar是否能正确地与java1.6一起工作,或者会在.class文件中的2个使用java1.7编译时生成java版本问题。注意-我知道测试它很容易,而不是在这里询问,但我的测试环境只支持java1.8,它运行得很好,但无论它是否与java1.6一起运行,我都无法测试。
如果使用:javac Foo.java
编译,其中javac
来自JDK1.7安装,然后尝试运行在JDK1.6上生成的类文件,则它将不起作用。
然而,你所需要做的就是:
javac -source 1.6 -target 1.6 Foo.java
,然后它会,除非您使用了1.7中的功能。如果你使用语言特性(我想不出任何特性,所以我对此表示怀疑(,它不会编译,因此你知道。如果您使用API,它将编译,而您不会知道。除了使用JDK1.6进行编译(或者使用javac7针对JDK1.6的bootcp进行编译,但您需要下载并安装JDK1.6才能实现;然后还可以使用javac6(之外,没有简单的解决方案。
二进制兼容性
根据JVM规范,JavaSE7的类文件版本是51,因为JSR292引入了invokedynamic字节码。Java SE 7编译器生成的51版类文件不能在Java SE 6中使用。
除了不兼容之外,Java SE 7与Java SE 6是二进制兼容的。除了注意到的不兼容之外,使用Java SE 6编译器构建的类文件将在Java SE 7中正确运行。
朋友的话
编译器不向后兼容,因为使用Java7 JDK生成的字节码不会在Java 1.6 jvm中运行(除非使用-target 1.6标志编译(。但是JVM是向后兼容的,因为它可以运行较旧的字节码。
因此,他们选择从javac的角度考虑兼容性(因为它是JDK特有的部分(,这意味着生成的字节码可以在jvm的未来版本中运行(这与JRE更相关,但也捆绑在JDK中(。
简而言之,我们可以说:
JDK's are (usually) forward compatible.
JRE's are (usually) backward compatible.
Java说
交叉编译选项
默认情况下,类是根据javac附带的平台的引导和扩展类编译的。但是javac也支持交叉编译,其中类是根据不同Java平台实现的引导和扩展类编译的。交叉编译时使用-bootclasspath和-extdirs是很重要的;请参阅下面的交叉编译示例。
-target version
Generate class files that target a specified version of the VM. Class files will run on the specified target and on later versions, but not on earlier versions of the VM. Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).
The default for -target depends on the value of -source:
If -source is not specified, the value of -target is 1.7
If -source is 1.2, the value of -target is 1.4
If -source is 1.3, the value of -target is 1.4
If -source is 1.5, the value of -target is 1.7
If -source is 1.6, the value of -target is 1.7
For all other values of -source, the value of -target is the value of -source.
-bootclasspath bootclasspath
Cross-compile against the specified set of boot classes. As with the user class path, boot class path entries are separated by colons (:) and can be directories, JAR archives, or ZIP archives.
有关交叉编译的更多信息,请查看http://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-选项
在比我强http://www.oracle.com/technetwork/java/javase/compatibility-417013.html
Java 7和Java 6版本的代码库非常相似,甚至共享许多相同的错误。例如,当Java 7发布用于循环优化时,这是一个众所周知的错误,人们建议在迁移之前等待它得到修复。有趣的是,这个bug也出现在Java 6中,唯一的区别是优化在Java 7中默认打开,在Java 6默认关闭。
Java 7中的大多数性能改进都是向后移植到Java 6中的。