2012-04-11 75 views
23

由于公共Java 6 SE JRE越来越接近它的EOL(11月'12),因此我正在考虑将我的项目从Java 6移植到Java 7.这不会是一件大事,如果Apple将提供Java 7 JRE for Mac OS X.但是由于Apple不愿意这样做,我仍然需要支持只有Java 6 JRE的用户。是否可以使用可在Java 6 JVM上运行的Java 7 SDK编译类文件?

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

感谢您的期待!

+1

相关:http://stackoverflow.com/questions/4061965/if-i-compiled-a-java-file-in-the-newest-jdk-would-an-older-jvm-be-able-to -run-t – assylias 2012-04-11 14:26:18

+0

[Set ant bootclasspath:JDK 1.7有一个新的javac警告,用于在没有bootclasspath的情况下设置旧的源代码](http://stackoverflow.com/questions/7260697/set-ant-bootclasspath-jdk-1 -7-has-a-new-javac-warning-for-setting-an-old-sour) – 2013-07-30 22:52:06

+0

http://stackoverflow.com/questions/7661980/compiling-java-7-to-java-6 – karmakaze 2013-08-24 19:42:04

回答

21

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

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

这包括Java 7语言功能...和对Java 7的依赖关系更改为标准类库API。另外请注意,可能导致代码在Java 6和Java 7上以不同方式运行的行为差异很小(也称为API错误修复)。它们应该在Java 6至Java 7转换文档中进行描述。


UPDATE - 这可能不再是一个你无论如何问题,因为Oracle已经发布的Java 7的Mac OSX。

+0

如果您仍然因此发生错误,您可以暂时切换回Java 6.通过运行'/ usr/libexec/java_home -v'1.6 *''查找路径。然后,使用'export JAVA_HOME =“/ path/to/java6 /”'将其设置为Java主路径。通过运行'java -version'验证它是否工作正常。 – user2398029 2012-12-26 21:45:31

+0

@louism - 在Windows和Linux(至少)设置JAVA_HOME不会直接影响运行'java'时运行的命令。 Mac OSX有什么不同? – 2012-12-27 11:19:23

+0

它看起来像它!请参阅gist.github.com/4394202。 – user2398029 2012-12-28 03:20:12

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). 
3

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

3

Stephen C的回答是正确的,但并不完整。如果您的Java 7程序使用Java 7语言功能,那么Java 7程序将无法在Java 6中编译,但要警告其他错误仍可能发生,只需一位开发人员在Java 6中编写代码,另一位编译Java 7.

以Java为例。 sql.Driver。在Java 7中,该接口获得了另一种方法。

爪哇7开发 此显影剂实现了驱动程序接口,并使用在实施附加的驱动方法中的“覆盖”注释。该程序编译得很好,因为Java 6编译器看到的类具有该方法并且代码已签入。将程序编译为Java 6并不意味着Java 6编译器将自动切换为使用Java 6源代码码!

Java 6的开发者 Java 6的开发者试图构建Java 7开发商承诺的代码,并得到即使Java 7的开发者并没有实现任何Java 7语言结构编译错误。

因此,即使你可能编译为Java 6,我会建议不要这样做。

相关问题