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

The*_*eLQ 13 java java-5 java-7

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

bootstrap class path not set in conjunction with -source 1.5
Run Code Online (Sandbox Code Playgroud)

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

pau*_*sm4 13

这个Oracle博客解释了警告:

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

原因是,如果您未能为旧平台设置rt.jar,那么:

如果不采取第二步,javac将尽职尽责地使用旧语言规则与新库相结合,这可能导致类文件无法在旧平台上运行,因为可以包含对不存在的方法的引用.


Ste*_*n C 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上运行应用程序时,这将导致运行时错误.


bma*_*ies 6

  1. 你最好设置-source和-target 1.5.

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

  • +1因为我之前从未听说过maven-animal-sniffer,并希望我做过很多次.(10年内未更新的大学分配测试环境= argh.) (2认同)
  • 我认为也建议设置`-target 1.5`.我认为类文件格式版本号在1.5和1.6之间碰撞,因此1.5 VM可能无法加载它们.(即使不是,比抱歉更安全.) (2认同)