自定义jar中的java版本问题

brgchamk  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(540)

我张贴这个问题,因为我有有限的资源来测试或确认我自己。问题陈述:我有一个使用Java1.6的旧定制jar。我们也没有源代码。为了解决其中一个问题,我们使用7-zip更新了这个jar的2.class文件。代码更改只是为了用更有意义的消息更新现有的记录器。这些2.class文件是用Java1.7编译的。现在的问题是,这个jar是否能在java1.6中正常工作,或者是否会生成java版本问题,因为有2个.class文件是用java1.7编译的。注意-我知道测试这个很容易,而不是在这里问,但我的测试环境只支持Java1.8,它的工作非常完美,但它是否将运行Java1.6我不能测试。

new9mtju

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中)。
简言之,我们可以说:

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.

有关交叉编译的更多信息,请参见athttp://docs.oracle.com/javase/7/docs/technotes/tools/windows/javac.html#crosscomp-选项
比我强athttp://www.oracle.com/technetwork/java/javase/compatibility-417013.html

kh212irz

kh212irz2#

Java7和Java6版本的代码基础非常相似,甚至有许多相同的bug。e、 g.在Java7中,当它发布时是一个众所周知的bug,它与循环优化有关,人们建议在迁移之前等待它被修复。有趣的是,这个bug也出现在Java6中,唯一的区别是Java7中的优化默认为打开,Java6中的优化默认为关闭。
Java7中的大部分性能改进都被移植到Java6中。

hrysbysz

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)。

相关问题