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