我张贴这个问题,因为我有有限的资源来测试或确认我自己。问题陈述:我有一个使用Java1.6的旧定制jar。我们也没有源代码。为了解决其中一个问题,我们使用7-zip更新了这个jar的2.class文件。代码更改只是为了用更有意义的消息更新现有的记录器。这些2.class文件是用Java1.7编译的。现在的问题是,这个jar是否能在java1.6中正常工作,或者是否会生成java版本问题,因为有2个.class文件是用java1.7编译的。注意-我知道测试这个很容易,而不是在这里问,但我的测试环境只支持Java1.8,它的工作非常完美,但它是否将运行Java1.6我不能测试。
3条答案
按热度按时间new9mtju1#
二进制兼容性
根据jvm规范,javase7的类文件版本是51,因为jsr292引入了invokedynamic字节码。JavaSE7编译器生成的51版类文件不能在JavaSE6中使用。
除了不兼容之外,JavaSE7与JavaSE6是二进制兼容的。除了注意到的不兼容之外,用JavaSE6编译器构建的类文件将在JavaSE7中正确运行。
朋友的话。。。
编译器不向后兼容,因为用java7jdk生成的字节码不会在java1.6jvm中运行(除非用-target1.6标志编译)。但是jvm是向后兼容的,因为它可以运行较旧的字节码。
因此,他们选择从javac的Angular 考虑兼容性(因为它是jdk特有的部分),这意味着生成的字节码可以在jvm的未来版本中运行(与jre更相关,但也捆绑在jdk中)。
简言之,我们可以说:
java 说
交叉编译选项
默认情况下,类是根据javac附带的平台的引导类和扩展类编译的。但是javac也支持交叉编译,其中类是根据不同java平台实现的引导类和扩展类编译的。交叉编译时使用-bootclasspath和-extdirs很重要;参见下面的交叉编译示例。
有关交叉编译的更多信息,请参见athttp://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-选项
比我强athttp://www.oracle.com/technetwork/java/javase/compatibility-417013.html
kh212irz2#
Java7和Java6版本的代码基础非常相似,甚至有许多相同的bug。e、 g.在Java7中,当它发布时是一个众所周知的bug,它与循环优化有关,人们建议在迁移之前等待它被修复。有趣的是,这个bug也出现在Java6中,唯一的区别是Java7中的优化默认为打开,Java6中的优化默认为关闭。
Java7中的大部分性能改进都被移植到Java6中。
hrysbysz3#
如果编译时使用:
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)。