Java 9のマルチリリースJAR(マルチバージョン互換JAR)とは?作成方法と使い方を解説
マルチリリースJAR(Multi-Release JAR)とは
Java 9で導入されたマルチリリースJAR(マルチバージョン互換JAR)機能を使うと、特定のバージョンのJava環境でプログラムを実行する際にのみ使用される、クラスのバージョン違いを1つのJARファイルに含めることができます。コンパイル時のターゲットバージョンは「--release」パラメータで指定します。
具体的な変更点として、「META-INF」ディレクトリ内の「MANIFEST.MF」ファイルに、次の新しい属性を追加します。
Multi-Release: true
また、「META-INF」ディレクトリの下には新しい「versions」ディレクトリを作成します。Java 9をサポートしたい場合は、versionsディレクトリの下に「9」という名前のディレクトリを配置し、そこにJava 9向けのクラスファイルを格納します。
multirelease.jar
├── META-INF
│ └── versions
│ └── 9
│ └── multirelease
│ └── Helper.class
├── multirelease
├── Helper.class
└── Main.classこの構造により、JARファイル自体は1つのまま、実行環境のJavaバージョンに応じて適切なクラスが自動的に読み込まれます。
マルチリリースJARの作成手順
以下の例では、マルチリリースJAR機能を使って「Test.java」から2つのバージョンのjarパッケージを生成します。1つはJDK 7向け、もう1つはJDK 9向けのもので、それぞれ異なる環境で実行して動作を確認します。
ステップ1:Java 7用のソースコードを作成する
まず「C:/test/java7/com/tutorialspoint」というフォルダを作成し、その中に以下の内容で「Test.java」ファイルを作成します。
package com.tutorialspoint;
public class Test {
public static void main(String args[]) {
System.out.println("Inside Java 7");
}
}ステップ2:Java 9用のソースコードを作成する
次に「C:/test/java9/com/tutorialspoint」というフォルダを作成し、その中に以下の内容で「Test.java」ファイルを作成します。
package com.tutorialspoint;
public class Test {
public static void main(String args[]) {
System.out.println("Inside Java 9");
}
}ステップ3:コードをコンパイルする
各ソースコードは、以下のコマンドでコンパイルできます。
C:\test> javac --release 9 java9/com/tutorialspoint/Test.java C:\test> javac --release 7 java7/com/tutorialspoint/Test.java
「--release」オプションを指定することで、対象とするJavaプラットフォームのバージョンに合わせた形式でクラスファイルが生成されます。
ステップ4:マルチリリースJARを作成する
以下のコマンドで、マルチリリース対応のjarパッケージを作成できます。
C:\JAVA> jar -c -f test.jar -C java7 . --release 9 -C java9 Warning: entry META-INF/versions/9/com/tutorialspoint/Test.java, multiple resources with same name
このコマンドでは、基本となるクラスとしてJava 7版を格納し、「--release 9」以降に指定したファイルがMETA-INF/versions/9配下に配置されます。同名のエントリが複数存在することによる警告が表示されることがありますが、これは仕様上の動作であり、実行には問題ありません。
ステップ5:実行結果を確認する
JDK 7で実行した場合:
C:\JAVA> java -cp test.jar com.tutorialspoint.Test Inside Java 7
JDK 9で実行した場合:
C:\JAVA> java -cp test.jar com.tutorialspoint.Test Inside Java 9
このように、同一のJARファイルでありながら、実行環境のJavaバージョンに応じて適切なクラスが自動的に選択されます。これにより、旧バージョンとの互換性を維持しながら、新バージョン向けに最適化したコードを単一のJARで配布できるため、ライブラリ開発者の利便性が大きく向上します。
-
JavaにおけるFontクラスとFontMetricsクラスの違いとは?
Javaでテキストを描画する際、FontクラスとFontMetricsクラスはそれぞれ異なる役割を担っています。両者の違いを簡単にまとめると、Fontクラスは画面に表示するフォントを設定し、言語の文字を対応するグリフ(字形)にマッピングするためのものです。一方、FontMetricsクラスはフォントメトリクスオブジェクトを定義し、特定の画面上で特定のフォントをレンダリングする際の情報(文字幅や高さなど)をカプセル化します。 Fontクラスとは Fontクラスは、Fontオブジェクトのインスタンスを作成するために使用されます。このオブジェクトを使うことで、テキストの描画やラベル、テキストフィー
-
JavaのsetBounds()メソッドとは?使い方とサンプルコードを解説
JavaのGUIプログラミングでは、レイアウトマネージャー(Layout Manager)がコンポーネントの位置やサイズを自動的に決定します。しかし、レイアウトマネージャーを使用しない場合は、コンポーネントの位置とサイズを手動で設定する必要があります。そのような場面で活躍するのがsetBounds()メソッドです。フレームのレイアウトマネージャーをnullに設定することで、コンポーネントの位置とサイズを自由に指定できるようになります。setBounds()メソッドの基本setBounds()メソッドは4つの引数を取ります。第1引数と第2引数はコンポーネントの左上隅のx座標・y座標、第3引数はコ