【问题标题】:"maven.compiler.release" as an replacement for source and target?“maven.compiler.release”作为源和目标的替代品?
【发布时间】:2020-03-21 19:35:06
【问题描述】:

我有两个关于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>

如果我使用&lt;maven.compiler.release&gt;-property,是否还要在插件中设置发布标签?

<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的编译文件大小会更大还是编译需要更多时间?

【问题讨论】:

  • 只需&lt;maven.compiler.release&gt;12&lt;/maven.compiler.release&gt; 属性就足够了。而且您不需要设置 maven-compiler-plugin 的配置。发布标签的配置是自动拾取的。 bootclasspath 部分是通过使用--release 选项自动完成的。文件的大小与此无关......所以简单的建议使用release 部分用于JDK9 +,否则源/目标......
  • @khmarbaise 方式不对您的评论做出答复?我们可以投一些赞成票,并将这个问题标记为已解决。
  • 请注意,您的示例中正确的发布版本是“12”,而不是“1.12”。

标签: maven maven-compiler-plugin


【解决方案1】:

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

因此,如果您盲目地只使用 &lt;maven.compiler.source&gt;8&lt;/maven.compiler.source&gt;&lt;maven.compiler.target&gt;8&lt;/maven.compiler.target&gt;,例如,如果您使用 Java 11 构建,生成的类文件将支持 Java 8,但 API 可能仍依赖于 Java 11 的更改,并且在 Java 8 上运行时会中断. 更多讨论请见How should javac 11 link methods overridden in later versions with a Java 8 target?

如果您想指定 Java 8 但构建在 Java 9+ 之上,那么解决方案并不是那么简单。您需要使用 Java 8 支持的编译器选项指定源和目标:

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

然后您需要在 &lt;profiles&gt; 部分中设置一个单独的配置文件,该配置文件仅在 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 上构建,其他两个选项将设置源代码和类文件格式为 Java 8,并且 API 将根据定义与 Java 8 兼容。

对于所有相关人员来说,更好的选择当然是尽快迁移到 Java 11。

【讨论】:

  • 嗨,我们不能只添加 3 个属性而不设置配置文件吗? 1.81.88(我编辑了我的评论:我认为源和目标应该设置为“1.8”而不是“8”)
  • 不,我不相信这是可能的,因为 Java 8 编译器会抱怨它不理解“源”选项。试试看,让我知道它的作用。
【解决方案2】:

只需&lt;maven.compiler.release&gt;12&lt;/maven.compiler.release&gt; 属性就足够了。而且您不需要设置 maven-compiler-plugin 的配置。发布标签的配置是自动拾取的。 bootclasspath 部分是通过使用--release 选项自动完成的。文件的大小与那个无关......

如此简单的建议使用 release 部分用于 JDK9+ 否则源/目标...

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-09-21
  • 2012-02-17
  • 2020-10-09
  • 2015-06-19
  • 1970-01-01
  • 2021-09-27
  • 2012-09-26
  • 2012-08-19
相关资源
最近更新 更多