在Java1.7上编译Java1.5是否仍然有效?

在Java1.7上编译Java1.5是否仍然有效?,java,java-7,java-5,Java,Java 7,Java 5,我最近在一个项目中转到了Java7。我声称它可以在Java1.5上运行,因为Java6或Java7中没有我所依赖的东西。然而,在今天编译时,我注意到: bootstrap class path not set in conjunction with -source 1.5 谷歌几乎找不到关于这一警告的信息。这是否意味着您不能从Java1.7编译到Java1.5 您最好将-source和-target设置为1.5 为了确保不会意外地合并对较新类、方法或字段的依赖,请使用maven animal

我最近在一个项目中转到了Java7。我声称它可以在Java1.5上运行,因为Java6或Java7中没有我所依赖的东西。然而,在今天编译时,我注意到:

bootstrap class path not set in conjunction with -source 1.5
谷歌几乎找不到关于这一警告的信息。这是否意味着您不能从Java1.7编译到Java1.5

  • 您最好将-source和-target设置为1.5

  • 为了确保不会意外地合并对较新类、方法或字段的依赖,请使用maven animal sniffer插件或类似插件


  • 此Oracle博客解释了警告:

    原因是,如果无法为旧平台设置rt.jar,那么:

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

    这是否意味着您不能从Java1.7编译到Java1.5

    不,没有。这意味着做这件事有正确的方法和错误的方法。。。而你的做法是错误的

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

    • 从Java1.5中获取“rt.jar”的副本,并将其放在编译引导类路径上

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

    警告消息告诉您,您尚未执行第一个操作


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

    --source 1.5将确保源文件符合Java 5约定--Target1.5将确保生成的类文件符合Java5约定。这两种方法都不能防止您使用Java6或Java7库方法。您必须使用--bootclasspath根据适当的rt.jar进行编译,或者使用类似动物嗅探器插件(如果您使用的是maven)的东西,该插件将检查所有内容的类型签名,并与已发布的配置文件进行比较


    使用animal sniffer插件,您可能会遇到麻烦,因为您可能会遇到使用Java 6 API的第三方库,这可能会导致您的构建过程失败,因为您正在购买Java 5。

    不确定错误消息,但我会对每个重要的(1.x)进行自动运行的单元测试我声称支持的Java版本。+1,因为我以前从未听说过maven animal sniffer,希望我听过很多次。(10年未更新的大学作业测试环境=argh。)我认为还建议设置
    -目标1.5
    。我认为类文件格式的版本号在1.5和1.6之间波动,因此1.5虚拟机可能无法加载它们。如果指定了
    -source
    -target
    ,1.7编译器会提示输入
    -xbootclasspath
    ,这就解释了第2点。动物嗅探器插件暴露的一个问题是,某些第三方库可能使用Java 6或7 API。这是Java库的一个问题,它并没有真正被揭示出来,因为我们都只是升级、升级和升级。Scala和sbt在交叉构建不同版本的库方面做得更好。