Mavenを使用したマルチリリースJARファイル
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クラス。
私たちはそれを見ることができます
ただし、 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でから入手できます。