我最近在我的一个项目中迁移到 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?
这个 Oracle 博客解释了警告:
http://blogs.oracle.com/darcy/entry/bootclasspath_older_source
原因是,如果您未能为旧平台设置 rt.jar,则:
如果不采取第二步,javac 将尽职尽责地使用旧语言规则与新库相结合,这可能导致类文件在旧平台上不起作用,因为可能包含对不存在的方法的引用。
这是否意味着您无法从 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 上运行应用程序时,这将导致运行时错误。
你最好设置 -source 和 -target 1.5。
要真正确保您不会意外地合并对新类、方法或字段的依赖关系,请使用 maven-animal-sniffer 插件或类似的东西。
--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,这可能会导致您的构建过程失败。