繁体   English   中英

为单个 API 创建 Java 8 和 Java 11 构建

[英]Create Java 8 and Java 11 build for single API

我们正在努力将我们的 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

TL;博士

您不需要它,只需构建到 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 目标;
  • 您不需要目标属性,但如果某些插件失败,请将其放回原处。

你应该:

  • 从您的 POM(如果存在)中删除maven.compiler.sourcemaven.compiler.target
  • 设置JAVA_HOME=<<JAVA_8_HOME_FOLDER>>
  • 通过mvn clean install从 Java 8 构建。
  • 以 Java 8 工件为例。
  • 设置JAVA_HOME=<<JAVA_11_HOME_FOLDER>>
  • 通过mvn clean install从 Java 11 构建。
  • 以 Java 11 工件为例。

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

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

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

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

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

因此,您需要在 pom.xml 的<build>部分添加以下代码段:

<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>

我希望这会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM