Maven编译器源代码和目标版本

4

我已经搜索了所有关于为什么我们应该有与目标不同的源代码的答案,但没有一个令人信服:

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
      <source>1.7</source>
      <target>1.8</target>
    </configuration>
  </plugin>

如果JDK向后兼容,为什么编译在1.7上时需要将目标设置为1.8?
将源设置得比目标高是行不通的,例如错误的例子:
源版本8需要目标版本1.8。
此外,从Maven中可以看到:
仅仅设置目标选项并不能保证你的代码能够在指定版本的JRE上运行。陷阱就是无意中使用了只存在于后来的JRE中的API,这会导致你的代码在运行时出现链接错误。
有人能给个例子吗?Maven的源和目标是针对我的源代码而不是依赖项的,那么我在自己的代码中编译成功后,什么情况下可以使用后来JRE中的API呢?
1个回答

2
通常情况下,我们会将目标JVM设置为与源JVM相匹配。否则,如果未设置目标JVM,则Java编译器的版本将设置为该JVM版本。例如,如果您使用Java 10构建,则目标类文件仅在指定了较低的目标JVM时才能在Java 10下运行。
我猜在以下情况下,您的企业将针对高于源Java兼容性的目标JVM(例如Java 8 b/c或安全和/或性能原因)进行定位,那么您将设置更高的目标版本。也许您可能会“共享”此代码库给其他人,他们仍然可能会针对Java 7 JVM进行定位。

如果你使用Java 10进行构建,那么目标类文件只能在Java 10下运行,除非你指定了更低的目标JVM。就像我上面提到的问题一样,你不能将目标版本设置为更低的版本,我已经尝试过了。 - Mohammad Karmi
您可以将目标JVM设置为较低版本,例如将其设置为1.8。 请参阅https://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html。 - N. Ngo
回答问题:“如果JDK向后兼容,为什么在使用1.7进行编译时需要将目标设置为1.8?”您不能使用旧版本的JDK来针对新版本的Java。具体而言,您不能使用JDK 7来构建专门用于Java 8的类。在这种情况下(使用JDK 7),Maven构建应该会失败。 - N. Ngo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接