是否可以使用可在Java 6 JVM上运行的Java 7 SDK编译类文件?

由于公共Java 6 SE JRE越来越接近它的EOL(11月12日),我正在考虑将我的项目从Java 6移植到Java 7.如果Apple提供Java 7 JRE,这将不是什么大问题。对于Mac OS X.但由于Apple不愿意这样做,我仍然需要支持只拥有Java 6 JRE的用户。

有没有办法用Java 7 javac编译Java 6兼容的二进制文件(类文件)? 当然,我知道在这样做时我不能使用新的Java 7function。

谢谢你的期待!

这取决于。 如果您的程序不使用新的Java 7语言扩展,那么您可以使用-source 1.6-target 1.6选项运行Java编译器。 但是如果你使用Java 7语言扩展,那么-source 1.6将导致编译错误。

当然,我知道在这样做时我不能使用新的Java 7function。

这包括Java 7语言特性……以及对Java 7的依赖性对标准类库API的更改。 另请注意,存在少量行为差异(即API错误修复)可能导致代码在Java 6和Java 7上以不同方式运行。应在Java 6到Java 7转换文档中对其进行描述。


更新 – 无论如何,这可能不再是一个问题,因为Oracle已经发布了适用于Mac OSX的Java 7。

我安装了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). 

是的,但在某些情况下没有。 在java 1.6中,他们没有使用资源,切换字符串或多捕获语句等等。因此程序的那些部分将无法编译。 但java的想法是编译一次,到处运行; 所以代码可以在旧的JVM上运行

Stephen C的答案是正确的,但并不完整。 如果Java 7程序使用Java 7语言function,则它们将无法在Java 6中编译,但是如果一个开发人员使用Java 6编写代码并且另一个编译Java 7,则可能会发出一些其他错误。

以java.sql.Driver为例。 在Java 7中,界面获得了另一种方法。

Java 7 Developer这个开发人员实现了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,我也建议不要这样做。