1. 序章

Java 9 がもたらす新機能の1つは、マルチリリースJAR(MRJAR)を構築する機能です。 JDK拡張提案が言うように、これにより、同じJAR内に異なるJavaリリース固有のバージョンのクラスを含めることができます。

このチュートリアルでは、Mavenを使用してMRJARファイルを構成する方法について説明します。

2. Maven

Maven は、Javaエコシステムで最も使用されているビルドツールの1つです。 その機能の1つは、プロジェクトをJARにパッケージ化することです。

次のセクションでは、代わりにMRJARを構築するためにそれを使用する方法を探ります。

3. サンプルプロジェクト

基本的な例から始めましょう。

まず、現在使用されているJavaバージョンを出力するクラスを定義します。 Java 9より前は、使用できるアプローチの1つはSystem.getPropertyメソッドでした。

public class DefaultVersion {
    public String version() {
        return System.getProperty("java.version");
    }
}

これで、Java 9以降、Runtimeクラスの新しいversionメソッドを使用できるようになりました。

public class DefaultVersion {
    public String version() {
        return Runtime.version().toString();
    }
}

このメソッドを使用すると、 Runtime.Version クラスインスタンスを取得して、新しいバージョン文字列スキーム形式で使用されるJVMに関する情報を取得できます。

さらに、 App クラスを追加して、バージョンをログに記録しましょう。

public class App {

    private static final Logger logger = LoggerFactory.getLogger(App.class);

    public static void main(String[] args) {
        logger.info(String.format("Running on %s", new DefaultVersion().version()));
    }

}

最後に、DefaultVersionの各バージョンを独自のsrc/mainディレクトリ構造に配置しましょう。

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── baeldung
│   │   │           └── multireleaseapp
│   │   │               ├── DefaultVersion.java
│   │   │               └── App.java
│   │   └── java9
│   │       └── com
│   │           └── baeldung
│   │               └── multireleaseapp
│   │                   └── DefaultVersion.java

4. 構成

上記のクラスからMRJARを構成するには、2つのMavenプラグイン(コンパイラプラグインとJARプラグイン)を使用する必要があります。

4.1. Mavenコンパイラプラグイン

Mavenコンパイラプラグインでは、パッケージ化するJavaバージョンごとに1つの実行を構成する必要があります。

この場合、2つ追加します。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <executions>
                <execution>
                    <id>compile-java-8</id>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </execution>
                <execution>
                    <id>compile-java-9</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                    <configuration>
                        <release>9</release>
                        <compileSourceRoots>
                            <compileSourceRoot>${project.basedir}/src/main/java9</compileSourceRoot>
                        </compileSourceRoots>
                        <outputDirectory>${project.build.outputDirectory}/META-INF/versions/9</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

最初の実行compile-java -8を使用してJava8クラスをコンパイルし、 compile- java-9実行を使用してJavaをコンパイルします。 9クラス。

私たちはそれを見ることができます Java 9バージョンでは、それぞれのフォルダーを使用してcompileSourceRootタグとoutputDirectoryタグを構成する必要があります。

ただし、 maven-compiler-plugin 3.7.1 以降、出力ディレクトリを手動で設定する必要はありません。 代わりに、multiReleaseOutputプロパティを有効にするだけです

<configuration> 
    <release>9</release> 
    <compileSourceRoots> 
        <compileSourceRoot>${project.basedir}/src/main/java9</compileSourceRoot> 
    </compileSourceRoots> 
    <multiReleaseOutput>true</multiReleaseOutput>
</configuration>

true に設定すると、コンパイラプラグインはすべてのリリース固有のクラスを META-INF / version / ${release}ディレクトリに移動します。 ここでリリースタグを目的のJavaバージョンに設定する必要があることに注意してください。そうしないと、コンパイラプラグインが失敗します

4.2. MavenJARプラグイン

JARプラグインを使用して、MANIFESTファイルのMulti-Releaseエントリをtrueに設定します。 この構成では、JavaランタイムはJARファイルの META-INF /versionsフォルダー内でバージョン固有のクラスを検索します。 それ以外の場合は、基本クラスのみが使用されます。

maven-jar-plugin構成を追加しましょう。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.2.0</version>
    <configuration>
        <archive>
            <manifestEntries>
                <Multi-Release>true</Multi-Release>
            </manifestEntries>
        </archive>
    </configuration>
</plugin>

5. テスト

生成されたJARファイルをテストする時が来ました。

Java 8で実行すると、次の出力が表示されます。

[main] INFO com.baeldung.multireleaseapp.App - Running on 1.8.0_252

しかし、Java 14で実行すると、次のようになります。

[main] INFO com.baeldung.multireleaseapp.App - Running on 14.0.1+7

ご覧のとおり、現在は新しい出力形式を使用しています。 MRJARはJava9で構築されていますが、複数の主要なJavaプラットフォームバージョンと互換性があることに注意してください。

6. 結論

この簡単なチュートリアルでは、単純なMRJARを生成するようにMavenビルドツールを構成する方法を説明しました。

いつものように、このチュートリアルで提示される完全なコードは、GitHubから入手できます。