用 Java 6、7 或 8 编译 Java 6 工件是否重要?

Does it matter if a Java 6 artifact gets compiled with Java 6, 7 or 8?

我已经配置了一个持续集成工具 (Travis CI) 以 运行 我所做的每一次提交,它在以下 JDK 上构建我的 Java 6 项目的:

现在 Travis CI 不(还)原生支持在所有任务完成后上传创建的工件的任务,所以我正在使用解决方法。

我的问题是解决方法将尝试将创建为 last.

的工件上传到 Sonatype 快照存储库。

这意味着它会上传一次由Open JDK 6编译的快照,另一次由Open JDK 7等编译的快照,依此类推

这重要吗? Java 6 客户端可以使用由任何 Java 6+ JDK 编译的 Java 6 代码吗?我们已经知道代码(看起来)做了它打算做的事情,因为它编译并且此时测试已经通过。

Java 6 代码可以在任何 Java 6 兼容的 JRE 和 Android.

上 运行

如果您在 Java 6 和 Java 8(定义目标版本)中成功构建您的代码,您可以将您的代码提供给其他人,只需要他们有 Java 6+(同时设置目标版本),它将在任何 Java 6 或更高版本上运行。

为此,您需要设置 -target 1.6 -source 1.6 或在 maven-compiler-plugin 中指定版本。 (强烈建议您使用构建工具)

在 maven 中你会设置

<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

任何使用您构建的人都将创建一个 JAR,其中包含可在 Java 6+

上运行的字节码

当你在 Java 8 中为 Java 6 编译字节码时,可以在 Java 6+

上使用

你发现问题的地方是 Java 8 在 JDK 中比 Java 6 有更多的 classes 和方法。这意味着 Java 8 编译器将愉快地编译 Java 6,它使用 class,Java 8 中可用但 Java 6 中不可用的方法或字段。

可以告诉Java 8 编译器在编译代码时使用Java 6 库,但更简单的解决方案是使用Java 6 编译器,或者您可以假设这不会发生,或者您有另一种方法来检测 Java 6 代码仅使用 Java 6 可用的库。

第三方库可能会遇到同样的问题。您可能正在针对在 Java 8 中运行的第三方库版本进行编译,但是对于 Java 6,您必须使用旧版本的库(或者可能 none 存在)

您将遇到的另一个问题是 Java 8 修复了编译器中的一些错误,而 Java 6 允许。这些修复非常奇特,你必须编写非标准 Java 代码(由于编译器中的错误,Java 6 允许)

Javadoc 默认会抱怨 non-stand Javadoc 甚至在 Java 6 的 javadoc 将通过时无法构建。

没有。 - 但你必须指定 -target

当 Java 编译 类 时,它会为目标 Java JRE 编译它。有关参考,请参阅 javac option for javac 1.7 (and for Java8 here)

-target version
    Generate class files that target a specified version of the VM.
    Class files will run on the specified target and on later versions,
    but not on earlier versions of the VM.
    Valid targets are 1.1, 1.2, 1.3, 1.4, 1.5 (also 5), 1.6 (also 6), and 1.7 (also 7).

The default for -target depends on the value of -source:

    If -source is not specified, the value of -target is 1.7
    If -source is 1.2, the value of -target is 1.4
    If -source is 1.3, the value of -target is 1.4
    If -source is 1.5, the value of -target is 1.7
    If -source is 1.6, the value of -target is 1.7
    For all other values of -source, the value of -target is the value of -source.

因此,只有当代码不使用 [=23] 中可用的任何功能时,使用 Java8 javac 编译的代码(-target 为 1.7)才能在 Java7 JRE 上运行=]8 或更高版本。

因此,在您的情况下,使用您的 Java8 JDK 编译的代码,如果它没有 javac 命令的 -target 参数,甚至无法在 Java6。错误将是:UnsupportedClassVersionError