在Java 1.7上编译Java 1.5仍然有效吗?

时间:2011-10-21 23:53:59

标签: java java-7 java-5

我最近在我的一个项目中转到Java 7。我声称它可以在Java 1.5上运行,因为我在Java 6或7中没有依赖它。但是在今天编译时我注意到了这一点:

bootstrap class path not set in conjunction with -source 1.5

谷歌发现此警告的信息很少。这是否意味着您无法从Java 1.7编译为Java 1.5?

4 个答案:

答案 0 :(得分:13)

此Oracle博客解释了警告:

http://blogs.oracle.com/darcy/entry/bootclasspath_older_source

原因是,如果你没有为旧平台设置rt.jar,那么:

  

如果不采取第二步,javac将尽职尽责地使用旧版   语言规则与新库结合,可以导致类   自引用以来在旧平台上不起作用的文件   可以包括不存在的方法。

答案 1 :(得分:12)

  

这是否意味着您无法从Java 1.7编译到Java 1.5?

不,不。这意味着有一种正确的方法和一种错误的方法来做到这一点......而你这样做是错误的。

在Java 1.7 JDK上编译Java 1.5的正确方法是:

  • 从Java 1.5获取“rt.jar”的副本并将其放在编译bootclasspath上。

  • 使用-source 1.5和-target 1.5进行编译。

警告消息告诉您尚未完成第一项。


您正在构建的方式是隐式使用1.7版本的“rt.jar”用于Java运行时API。这个可以工作! (实际上,应该工作,假设您自上次构建1.5以来没有对代码进行任何更改。)但是,您可能会意外地在添加的类或方法中引入依赖项。 Java 1.6或1.7。当您尝试在Java 1.5上运行应用程序时,这将导致运行时错误。

答案 2 :(得分:6)

  1. 您最好设置-source和-target 1.5。

  2. 要确定您不会意外地将依赖项合并到较新的类,方法或字段上,请使用maven-animal-sniffer插件或类似的东西。

答案 3 :(得分:2)

- 源1.5将确保源文件符合Java 5约定。 --target 1.5将确保生成的类文件符合Java 5约定。这些都不会保护您使用Java 6或7库方法。您必须使用--bootclasspath针对相应的rt.jar进行编译,或者使用类似animal-sniffer-plugin(如果您使用的是maven),它将检查所有类型的签名,并与已发布的配置文件进行比较。

使用animal-sniffer-plugin,您可能会受到欢迎,因为您可能遇到使用Java 6 API的第三方库,这可能会导致您的构建过程失败,因为您正在使用Java 5。