【问题标题】:Create Java 8 and Java 11 build for single API为单个 API 创建 Java 8 和 Java 11 构建
【发布时间】:2022-07-05 02:27:59
【问题描述】:

我们正在努力将我们的 API 从 Java 8 升级到 Java 11。

但是我们需要同时支持 Java 8 和 Java 11,因为所有客户端都没有准备好迁移到 Java 11。

如果我们可以使用 Java 8 和 Java 11 创建 maven 构建,而无需复制我们的存储库,并且每次在为 Java 8 和 Java 11 创建构建之前都不更改 pom.xml 吗?

生成的工件应该有不同的名称来区分 Java 8 和 Java 11 版本,例如 xyz-jdk8-0.0.1.jar 和 xyz-jdk11-.0.1.jar

【问题讨论】:

  • Java 向后兼容:使用旧版本构建的 JAR 将在较新的 JRE 中运行。 1) 在 Java 8 中构建。 2) 升级所有运行时环境。 3) 升级构建服务器。 4) 升级开发者环境。
  • 使用 JDK11 构建并使用 --release 8 这将起作用...使用 <maven.compiler.release>8</maven.compiler.release> 并制定 maven-enforcer 规则以至少需要使用 JDK11 构建......
  • 我认为它应该对我有用 - stackoverflow.com/questions/10920142/…

标签: java maven


【解决方案1】:

TL;DR

您不需要它,只需构建到 Java 8 就可以了!


求解

您可以为此使用 Maven 构建配置文件: https://maven.apache.org/guides/introduction/introduction-to-profiles.html

1. 将您的属性设置为 Java 11:

<properties>
  <maven.compiler.target>11</maven.compiler.target>
  <maven.compiler.source>11</maven.compiler.source>
  <maven.compiler.release>11</maven.compiler.release>
</properties>

2. 设置您的姓氏:

<build>
  <finalName>${project.artifactId}-jdk11-${project.version}</finalName>
</build>

3.添加个人资料:

<profile>
  <id>jdk-8</id>
  <properties>
    <maven.compiler.target>1.8</maven.compiler.target>
    <maven.compiler.release>1.8</maven.compiler.release>
  </properties>
  <build>
    <finalName>${project.artifactId}-jdk8-${project.version}</finalName>
  </build>
</profile>

4. 构建:

您将需要运行 2 个构建,一个正常构建,另一个激活 JDK 8 配置文件:

$ mvn ...
$ mvn ... -P jdk-8

注意事项:

  • 始终使用 JDK 11,因为它可以自信地构建 Java 8 目标;
  • 您不需要 targetsource 属性,但如果某些插件失败,请将其放回原处。

【讨论】:

  • 谢谢。我还错过了一点,即 api jar 应该为 Java 8 和 Java 11 使用不同的名称,否则会给用户造成混淆。我认为 xyz-jdk8-version.jar 和 xyz-jdk11.version.jar。让我看看我们是否可以使用配置文件来做到这一点。
  • 是的,你可以,只是弄乱finalName:maven.apache.org/pom.html。编辑了我的答案。
【解决方案2】:

你应该:

  • 从您的 POM 中删除,如果存在,maven.compiler.sourcemaven.compiler.target
  • 设置JAVA_HOME=&lt;&lt;JAVA_8_HOME_FOLDER&gt;&gt;
  • mvn clean install 从 Java 8 构建。
  • 获取 Java 8 工件。
  • 设置JAVA_HOME=&lt;&lt;JAVA_11_HOME_FOLDER&gt;&gt;
  • mvn clean install 从 Java 11 构建。
  • 获取 Java 11 工件。

【讨论】:

  • 你真的试过了吗?
  • 是的,当然。
  • 谢谢。它会起作用,但是在每次构建之前更改 JAVA_HOME 并不容易
  • 认真的吗?不容易?输入一行。或者添加一行到 shell 脚本。
【解决方案3】:

我找到了一种方法,它有点位于 Java 8 和 Java 11 的中间。上述解决方案的主要问题发生在您拥有(或想要定义)一个不能的 module-info.java 的情况下在 Java 8 中解析。

我开始考虑使用&lt;classifier&gt;s 的解决方案,同样是上面答案的 Claudio Weiler,但不想打扰拥有两个独立的构建(甚至两个独立的分支,因为我想管理模块信息)。

我还注意到,当您在 Java 11 中使用 JAXB API 或激活 API (jakarta.xml.bind:jakarta.xml.bind-api:2.3.3) 等库时,它会显示 module-info,但与 Java 8 兼容 ?。

深入了解com.sun.activiation:jakarta.activation库的构建细节,我找到了以下解决方案:

  • 使用 Java 11 编译 module-info.java
  • 使用 Java 8 编译其余代码(包括测试)。当然,这样做的缺点是无法完全使用 Java 11 功能...

因此,您需要在 pom.xml 的 &lt;build&gt; 部分添加以下 sn-p:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <executions>
        <execution>
        <id>default-compile</id>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <excludes>
            <exclude>module-info.java</exclude>
            </excludes>
        </configuration>
        </execution>
        <execution>
        <id>module-info-compile</id>
        <goals>
            <goal>compile</goal>
        </goals>
        <configuration>
            <release>11</release>
            <includes>
            <include>module-info.java</include>
            </includes>
        </configuration>
        </execution>
        <execution>
        <id>default-testCompile</id>
        <configuration>
            <release>11</release>
        </configuration>
        </execution>
    </executions>
</plugin>

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    • 2019-02-07
    • 2016-03-15
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多