JARマニフェストファイルについて

1. 前書き

Java Archive(JAR)は、マニフェストファイルによって記述されます。 この記事では、属性の追加、JARの実行可能化、バージョン管理情報の埋め込みなど、多くの機能について説明します。
ただし、マニフェストファイルとは何かについて簡単に説明します。

2. マニフェストファイル

マニフェストファイルの名前は_MANIFEST.MF_で、JARの_META-INF_ディレクトリの下にあります。 これは、単に* _headers_または_attributes_と呼ばれる、セクションにグループ化されたキーと値のペアのリストです。
これらの_headers_は、パッケージのバージョン、実行するアプリケーションクラス、クラスパス、署名資料など、JARの側面を記述するのに役立つメタデータを提供します。

3. マニフェストファイルの追加

* 3.1。 デフォルトのマニフェスト*

マニフェストファイルは、https://www.baeldung.com/java-create-jar [JARを作成]するたびに自動的に追加されます。
たとえば、OpenJDK 11で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>
これにより、カスタム_package_および_created-by_ヘッダーを持つマニフェストファイルが生成されます。
Manifest-Version: 1.0
Build-Jdk-Spec: 11
Package: com.baeldung.java
Created-By: baeldung
オプションの完全なリストについては、https://maven.apache.org/plugins/maven-jar-plugin/ [Maven JARプラグインのドキュメント]を参照してください。

4. ヘッダー

ヘッダーは特定の形式に従い、改行で区切る必要があります。
key1: value1
Key2: value2
*有効なヘッダーには、コロンと値の間にスペースが必要です*。 別の重要なポイントは、*ファイルの最後に改行が必要*であることです。 それ以外の場合、最後のヘッダーは無視されます。
https://docs.oracle.com/en/java/javase/11/docs/specs/jar/jar.html#jar-manifest[specification]の標準ヘッダーと一般的なカスタムヘッダーの一部を見てみましょう。

* 4.1。 メインヘッダー*

通常、メインヘッダーは一般情報を提供します。
  • Manifest-Version:仕様のバージョン

  • Created-By:マニフェストを作成したツールのバージョンとベンダー
    file

  • Multi-Release:_true_の場合、これは
    Multi-Release Jar

  • Built-By:このカスタムヘッダーは、作成したユーザーの名前を提供します
    マニフェストファイル

* 4.2。 エントリポイントとクラスパス*

JARに実行可能なアプリケーションが含まれている場合、エントリポイントを指定できます。 同様に、_classpath_を提供できます。 そうすることで、実行したいときに指定する必要がなくなります。
  • Main-Class:mainメソッドを持つクラスのパッケージと名前(いいえ
    .class extension)

  • 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内のパッケージを記述します。
  • Name:パッケージ

  • Implementation-Build-Date:実装のビルド日

  • Implementation-Title:実装のタイトル

  • Implementation-Vendor:実装のベンダー

  • Implementation-Version:実装バージョン

  • Specification-Title:仕様のタイトル

  • Specification-Vendor:仕様のベンダー

  • Specification-Version:仕様バージョン

  • Sealed:trueの場合、パッケージのすべてのクラスは
    同じJAR(デフォルトはfalse)

    たとえば、これらのマニフェストヘッダーはMySQLドライバーConnector / J https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.16/mysql-connector-java-8.0.16.jarにあります。 [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をデジタル署名して、セキュリティと検証を追加できます。 このプロセスはこの記事の範囲外ですが、そうすると、各署名済みクラスとそのエンコードされた署名を示す標準ヘッダーがマニフェストファイルに追加されます*。 詳細については、https://docs.oracle.com/en/java/javase/11/docs/specs/jar/jar.html#signed-jar-file [JAR署名]ドキュメントを参照してください。

* 4.5。 OSGI *

カスタムhttps://www.osgi.org/bundle-headers-reference/[OSGIバンドルのヘッダー:]も参照するのが一般的です
  • バンドル名:タイトル

  • Bundle-SymbolicName:一意の識別子

  • Bundle-Version:バージョン

  • Import-Package:バンドルが依存するパッケージとバージョン

  • Export-Package:使用可能なバンドルパッケージとバージョン

    OSGIバンドルの詳細については、https://www.baeldung.com/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のコンテンツを説明するのに関連すると思われる情報を定義できます。