"maven.compiler.release" 作为源和目标的替代品?

"maven.compiler.release" as an replacement for source and target?

我有两个关于 maven.compiler.release-tag

的问题

我要更换

<properties>
    <maven.compiler.source>12</maven.compiler.source>
    <maven.compiler.target>12</maven.compiler.target>
</properties>

<properties>
     <maven.compiler.release>12</maven.compiler.release>
</properties>

如果我使用<maven.compiler.release>-属性,我是否也必须在插件中设置发布标签?

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <!-- do I need that ? -->
        <release>12</release>
    </configuration>
</plugin>

根据https://www.baeldung.com/maven-java-version设置为两者。

如果我使用 maven.compiler.release 而不是 maven.compiler.sourcemaven.compiler.target,那么 -bootclasspath 也会被设置并进行交叉编译。 这是什么意思?设置 -bootclasspath 编译文件大小会更大还是编译需要更多时间?

只需属性<maven.compiler.release>12</maven.compiler.release>就足够了。而且您也不需要设置 maven-compiler-plugin 的配置。发布标签的配置会自动获取。 bootclasspath 部分是使用 --release 选项自动完成的。文件大小与此无关...

如此简单的建议使用 JDK9+ 的 release 部分,否则 source/target...

另一个答案中的“简单建议”将无法正常工作,因为不幸的是情况并不简单。编译器选项的含义略有不同。 maven.compiler.sourcemaven.compiler.target 选项分别指的是源代码格式和生成的 class 文件的格式。但是他们没有maven.compiler.release那样考虑API变化。

因此,如果您盲目地只使用 <maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target>,如果您使用 Java 11 构建,例如生成的 class 文件将支持 Java 8 但 API 可能仍依赖于 Java 11 更改并在 Java 上的 运行 8 时中断。有关更多讨论,请参见

如果你想指定 Java 8 而是建立在 Java 9+ 上,解决方案就没那么简单了。您需要使用 Java 8:

支持的编译器选项指定源和目标
<properties>
  <maven.compiler.source>8</maven.compiler.source>
  <maven.compiler.target>8</maven.compiler.target>
</properties>

然后你需要在 <profiles> 部分设置单独的配置文件,该配置文件仅在 Java 9+ 中激活以打开 maven.compiler.release 选项:

<profile>
  <id>java-8-api</id>
  <activation>
    <jdk>[9,)</jdk>
  </activation>
  <properties>
    <maven.compiler.release>8</maven.compiler.release>
  </properties>
</profile>

如果您在 Java 9+ 上构建,maven.compiler.release 将生效并限制 API 与 Java 8 兼容。如果您构建在 Java 8 上,其他两个选项会将源代码和 class 文件格式设置为 Java 8,并且 API 将与 Java 8 兼容定义。

对每个参与者来说,更好的选择当然是尽快转到 Java 11。