JARマニフェストファイルを理解する
1. 序章
Javaアーカイブ(JAR)は、そのマニフェストファイルによって記述されます。 この記事では、アトリビューションの追加、JARの実行可能ファイルの作成、バージョン情報の埋め込みなど、その多くの機能について説明します。
ただし、マニフェストファイルとは何かを簡単に確認することから始めましょう。
2. マニフェストファイル
マニフェストファイルの名前はMANIFEST.MFで、JARのMETA-INFディレクトリの下にあります。 これは単にヘッダーまたは属性と呼ばれるキーと値のペアのリストであり、セクションにグループ化されています。
これらのヘッダーは、パッケージのバージョン、実行するアプリケーションクラス、クラスパス、署名資料など、JARの側面を説明するのに役立つメタデータを提供します。
3. マニフェストファイルの追加
3.1. デフォルトのマニフェスト
マニフェストファイルは、JARを作成するたびに自動的に追加されます。
たとえば、OpenJDK11でJARを構築する場合:
jar cf MyJar.jar classes/
非常に単純なマニフェストファイルを生成します。
Manifest-Version: 1.0
Created-By: 11.0.3 (AdoptOpenJDK)
3.2. カスタムマニフェスト
または、独自のマニフェストファイルを指定することもできます。
たとえば、manifest.txtというカスタムマニフェストファイルがあるとします。
Built-By: baeldung
このファイルを含めることができ、 m オプションを使用すると、jarはデフォルトのマニフェストファイルとマージします。
jar cfm MyJar.jar manifest.txt classes/
次に、結果のマニフェストファイルは次のとおりです。
Manifest-Version: 1.0
Built-By: baeldung
Created-By: 11.0.3 (AdoptOpenJDK)
3.3. Maven
現在、デフォルトのマニフェストファイルの内容は、使用するツールによって異なります。
たとえば、Mavenはいくつかの追加ヘッダーを追加します。
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven 3.3.9
Built-By: baeldung
Build-Jdk: 11.0.3
pomでこれらのヘッダーを実際にカスタマイズできます。
たとえば、JARの作成者とパッケージを示したいとします。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<archive>
<manifest>
<packageName>com.baeldung.java</packageName>
</manifest>
<manifestEntries>
<Created-By>baeldung</Created-By>
</manifestEntries>
</archive>
</configuration>
</plugin>
これにより、カスタムパッケージおよびcreate-byヘッダーを含むマニフェストファイルが生成されます。
Manifest-Version: 1.0
Build-Jdk-Spec: 11
Package: com.baeldung.java
Created-By: baeldung
オプションの完全なリストについては、MavenJARプラグインのドキュメントを参照してください。
4. ヘッダー
ヘッダーは特定の形式に従い、改行で区切る必要があります。
key1: value1
Key2: value2
有効なヘッダーには、コロンと値の間にスペースが必要です。 もう1つの重要な点は、ファイルの最後に新しい行が必要であるということです。 それ以外の場合、最後のヘッダーは無視されます。
仕様の標準ヘッダーのいくつかと一般的なカスタムヘッダーのいくつかを見てみましょう。
4.1. メインヘッダー
メインヘッダーは通常、一般的な情報を提供します。
- マニフェスト-バージョン:仕様のバージョン
- Created-By :マニフェストファイルを作成したツールのバージョンとベンダー
- マルチリリース: true の場合、これはマルチリリースジャーです。
- Built-By :このカスタムヘッダーは、マニフェストファイルを作成したユーザーの名前を示します
4.2. エントリポイントとクラスパス
JARに実行可能なアプリケーションが含まれている場合は、エントリポイントを指定できます。 同様に、クラスパスを提供できます。 そうすることで、実行するときに指定する必要がなくなります。
- Main-Class :mainメソッドを持つクラスのパッケージと名前(.class拡張子なし)
- Class-Path :ライブラリまたはリソースへの相対パスのスペース区切りのリスト
たとえば、アプリケーションのエントリポイントが Application.class にあり、ライブラリとリソースを使用している場合、必要なヘッダーを追加できます。
Main-Class: com.baeldung.Application
Class-Path: core.jar lib/ properties/
クラスパスには、 core.jar と、libおよびpropertiesディレクトリ内のすべてのファイルが含まれます。 これらのアセットは、JAR自体からではなく、JARが実行される場所に関連してロードされます。 つまり、JARの外部に存在する必要があります。
4.3. パッケージバージョンとシーリング
これらの標準ヘッダーは、JAR内のパッケージを記述します。
- 名前:パッケージ
- Implementation-Build-Date :実装のビルド日
- 実装-タイトル:実装のタイトル
- 実装-ベンダー:実装のベンダー
- 実装バージョン:実装バージョン
- 仕様-タイトル:仕様のタイトル
- 仕様-ベンダー:仕様のベンダー
- 仕様-バージョン:仕様バージョン
- Sealed :trueの場合、パッケージのすべてのクラスは同じJARから取得されます(デフォルトはfalse)
たとえば、これらのマニフェストヘッダーは、MySQLドライバーConnector / J JARにあります。 これらは、JARが満たすJDBC仕様のバージョンと、ドライバー自体のバージョンについて説明しています。
Specification-Title: JDBC
Specification-Version: 4.2
Specification-Vendor: Oracle Corporation
Implementation-Title: MySQL Connector/J
Implementation-Version: 8.0.16
Implementation-Vendor: Oracle
4.4. 署名された瓶
JARにデジタル署名して、セキュリティと検証を追加できます。 このプロセスはこの記事の範囲外ですが、これにより、署名された各クラスとそのエンコードされた署名を示す標準ヘッダーがマニフェストファイルに追加されます。 詳細については、JAR署名のドキュメントを参照してください。
4.5. OSGI
OSGIバンドルのカスタムヘッダーも表示されるのが一般的です:
- バンドル名:タイトル
- Bundle-SymbolicName :一意の識別子
- バンドル-バージョン:バージョン
- Import-Package :バンドルが依存するパッケージとバージョン
- Export-Package :使用可能なバンドルパッケージとバージョン
OSGIバンドルの詳細については、OSGIの概要の記事を参照してください。
5. セクション
マニフェストファイルには、メインとエントリごとの2種類のセクションがあります。 メインセクションに表示されるヘッダーは、JARのすべてに適用されます。 一方、エントリごとのセクションに表示されるヘッダーは、指定されたパッケージまたはクラスにのみ適用されます。
さらに、エントリごとのセクションに表示されるヘッダーは、メインセクションの同じヘッダーを上書きします。 エントリーごとのセクションには、パッケージのバージョンとシーリングおよびデジタル署名に関する情報が含まれているのが一般的です。
エントリごとのセクションの簡単な例を見てみましょう。
Implementation-Title: baeldung-examples
Implementation-Version: 1.0.1
Implementation-Vendor: Baeldung
Sealed: true
Name: com/baeldung/utils/
Sealed: false
上部のメインセクションは、JAR内のすべてのパッケージを封印しています。 ただし、パッケージ com.baeldung.utils は、エントリごとのセクションで開封されます。
6. 結論
この記事では、マニフェストファイルをJARに追加する方法、セクションの使用方法、およびいくつかの一般的なヘッダーの概要を説明します。 マニフェストファイルの構造により、バージョン情報などの標準情報を提供できます。
ただし、その柔軟性により、JARのコンテンツを説明するために関連すると思われる情報を定義できます。