由于公共Java 6 SE JRE越来越接近它的EOL(11月12日),我正在考虑将我的项目从Java 6移植到Java 7.如果Apple提供的话,这将不是什么大问题。适用于Mac OS X的Java 7 JRE。但由于Apple不愿意这样做,我仍然需要支持只拥有Java 6 JRE的用户。
有没有办法用Java 7 javac编译Java 6兼容的二进制文件(类文件)?当然,我知道在这样做时我不能使用新的Java 7功能。
感谢您的期待!
答案 0 :(得分:21)
这取决于。如果您的程序不使用新的Java 7语言扩展,那么您可以使用-source 1.6
和-target 1.6
选项运行Java编译器。但是如果使用Java 7语言扩展,那么-source 1.6
将导致编译错误。
当然,我知道在这样做时我无法使用新的Java 7功能。
包括Java 7语言特性......以及对Java 7的依赖性对标准类库API的更改。另请注意,存在少量行为差异(也称为API错误修复)可能导致代码在Java 6和Java 7上以不同方式运行。应在Java 6到Java 7转换文档中对其进行描述。
更新 - 无论如何,这可能不再是一个问题,因为Oracle已经发布了适用于Mac OSX的Java 7。
答案 1 :(得分:5)
我安装了jdk6。如果你查看javac的手册页:
Cross-Compilation Options
By default, classes are compiled against the bootstrap and extension classes of the platform that javac shipped with. But javac also supports cross-compil‐
ing, where classes are compiled against a bootstrap and extension classes of a different Java platform implementation. It is important to use -bootclasspath
and -extdirs when cross-compiling; see Cross-Compilation Example below.
-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) and 1.6 (also 6).
答案 2 :(得分:3)
是的,但在某些情况下没有。在java 1.6中,他们没有使用资源的尝试,使用字符串切换或多捕获语句等。因此程序的那些部分将无法编译。但java的想法是编译一次,到处运行;所以代码可以在旧的JVM上运行
答案 3 :(得分:3)
以java.sql.Driver为例。在Java 7中,界面获得了另一种方法。
Java 7开发人员 该开发人员实现了Driver接口,并在实现的附加Driver方法上使用了“Override”注释。该程序编译为Java 6程序,因为Java 6编译器看到的类确实具有该方法并且代码被签入。将程序编译为Java 6并不意味着Java 6编译器将自动切换为使用Java 6源代码代码!
Java 6开发人员 Java 6开发人员尝试构建Java 7开发人员提交的代码并获得编译错误,即使Java 7开发人员没有实现任何Java 7语言结构。
因此,即使您可以将其编译为Java 6,我也建议不要这样做。