13

我最近在我的一个项目中迁移到 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

4 回答 4

13

这个 Oracle 博客解释了警告:

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

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

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

于 2011-10-22T00:20:28.120 回答
12

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

不,它没有。这意味着有正确的方法和错误的方法可以做到这一点……而您的做法是错误的。

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

  • 从 Java 1.5 中获取“rt.jar”的副本并将其放在编译引导类路径中。

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

警告消息告诉您,您还没有完成其中的第一个。


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

于 2011-10-22T01:48:17.627 回答
6
  1. 你最好设置 -source 和 -target 1.5。

  2. 要真正确保您不会意外地合并对新类、方法或字段的依赖关系,请使用 maven-animal-sniffer 插件或类似的东西。

于 2011-10-22T00:12:12.930 回答
2

--source 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 的第3 方库,如果您正在使用Java 5,这可能会导致您的构建过程失败。

于 2012-08-28T18:37:32.563 回答