JAR、WAR、およびEARファイルには、フォルダーMANIFEST.MF
の下にファイルがあることに気付きました。META-INF
MANIFEST.MF
ファイルの用途は何ですか?このファイルで指定できるものは何ですか?
JAR、WAR、およびEARファイルには、フォルダーMANIFEST.MF
の下にファイルがあることに気付きました。META-INF
MANIFEST.MF
ファイルの用途は何ですか?このファイルで指定できるものは何ですか?
Java Development Kitのバージョン1.0で作成したJARファイルのマニフェストファイルの内容は以下の通りです。
Manifest-Version: 1.0
すべてのエントリは、名前と値のペアです。ヘッダーの名前は、その値からコロンで区切られます。デフォルトのマニフェストは、マニフェスト仕様のバージョン 1.0 に準拠していることを示しています。マニフェストには、アーカイブにパッケージ化されている他のファイルに関する情報も含めることができます。マニフェストに正確に記録されるファイル情報は、JAR ファイルの使用目的によって異なります。デフォルトのマニフェスト ファイルは、他のファイルに関して記録する必要がある情報について想定していないため、その 1 行にはそれ自体に関するデータのみが含まれます。専用のマニフェスト ヘッダー
JAR ファイルの目的の役割によっては、デフォルトのマニフェストを変更する必要がある場合があります。JAR ファイルがアーカイブの目的でのみ作成される場合、MANIFEST.MF ファイルは無意味です。JAR ファイルのほとんどの用途は、単純なアーカイブと圧縮を超えており、マニフェスト ファイルに特別な情報を含める必要があります。一部の特殊目的の JAR ファイル関数に必要なヘッダーの簡単な説明を以下に要約します。
JAR ファイルとしてバンドルされたアプリケーション:アプリケーションが JAR ファイルにバンドルされている場合、アプリケーションへのエントリ ポイントが何であるかを Java 仮想マシンに通知する必要があります。エントリ ポイントは、public static void main(String[] args) メソッドを持つ任意のクラスです。この情報は、一般的な形式を持つ Main-Class ヘッダーで提供されます。
Main-Class: classname
値 classname は、アプリケーションのエントリ ポイントに置き換えられます。
ダウンロード拡張機能:ダウンロード拡張機能は、他の JAR ファイルのマニフェスト ファイルによって参照される JAR ファイルです。典型的な状況では、アプレットは JAR ファイルにバンドルされます。そのマニフェストは、そのアプレットの拡張機能として機能する JAR ファイル (または複数の JAR ファイル) を参照します。拡張機能は、同じ方法で相互に参照できます。ダウンロード拡張機能は、アプレット、アプリケーション、または別の拡張機能のマニフェスト ファイルの Class-Path ヘッダー フィールドで指定されます。Class-Path ヘッダーは、たとえば次のようになります。
Class-Path: servlet.jar infobus.jar acme/beans.jar
このヘッダーを使用すると、ファイル servlet.jar、infobus.jar、および acme/beans.jar 内のクラスが、アプレットまたはアプリケーションの拡張機能として機能します。Class-Path ヘッダーの URL は、アプレットまたはアプリケーションの JAR ファイルの URL に対して相対的に指定されます。
パッケージの封印: JAR ファイル内のパッケージは、必要に応じて封印できます。つまり、そのパッケージで定義されているすべてのクラスを同じ JAR ファイルにアーカイブする必要があります。ソフトウェア内のクラス間でバージョンの一貫性を確保するため、またはセキュリティ対策として、パッケージが封印される場合があります。パッケージを封印するには、パッケージに Name ヘッダーを追加し、その後に次のような Sealed ヘッダーを追加する必要があります。
Name: myCompany/myPackage/
Sealed: true
Name ヘッダーの値は、パッケージの相対パス名です。ファイル名と区別するために「/」で終わることに注意してください。Name ヘッダーに続くすべてのヘッダーは、その間に空白行がなくても、Name ヘッダーで指定されたファイルまたはパッケージに適用されます。上記の例では、Sealed ヘッダーは Name: myCompany/myPackage ヘッダーの後に空白行がないため、Sealed ヘッダーはパッケージ myCompany/myPackage に適用される (のみ) と解釈されます。
パッケージのバージョン管理:パッケージのバージョン管理仕様では、バージョン管理情報を保持するためのいくつかのマニフェスト ヘッダーが定義されています。このようなヘッダーの 1 つのセットを各パッケージに割り当てることができます。バージョン管理ヘッダーは、パッケージの Name ヘッダーのすぐ下に表示されます。この例は、すべてのバージョン管理ヘッダーを示しています。
Name: java/util/
Specification-Title: "Java Utility Classes"
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "java.util"
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."
Manifest.MF には、JAR ファイルに含まれるファイルに関する情報が含まれています。
JAR ファイルが作成されるたびに、デフォルトの manifest.mf ファイルが META-INF フォルダー内に作成され、次のようなデフォルト エントリが含まれます。
Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
これらは、「ヘッダー:値」のペアとしてのエントリです。1 つ目はマニフェスト バージョンを指定し、2 つ目は JAR ファイルが作成される JDK バージョンを指定します。
Main-Class ヘッダー: JAR ファイルを使用してアプリケーションをパッケージにバンドルする場合、アプリケーションのエントリ ポイントを提供するクラスを指定する必要があります。この情報は、マニフェスト ファイルの「Main-Class」ヘッダーを使用して提供されます。
メインクラス: {完全修飾クラス名}
ここでの「Main-Class」値は、メイン メソッドを持つクラスです。このエントリを指定した後、JAR ファイルを実行してアプリケーションを実行できます。
Class-Path ヘッダー: ほとんどの場合、アプリケーションの JAR ファイル内にパッケージ化されたクラスから他の JAR ファイルにアクセスする必要があります。これは、'Class-Path' ヘッダーを使用してマニフェスト ファイルに完全修飾パスを指定することで実行できます。
Class-Path: {jar1-name jar2-name ディレクトリ名/jar3-name}
このヘッダーを使用して、現在の JAR 内ではなく、同じローカル ネットワーク上の外部 JAR ファイルを指定できます。
パッケージ バージョン関連のヘッダー: JAR ファイルがパッケージのバージョン管理に使用される場合、Java 言語仕様で指定されているように、次のヘッダーが使用されます。
Headers in a manifest
Header | Definition
-------------------------------------------------------------------
Name | The name of the specification.
Specification-Title | The title of the specification.
Specification-Version | The version of the specification.
Specification-Vendor | The vendor of the specification.
Implementation-Title | The title of the implementation.
Implementation-Version | The build number of the implementation.
Implementation-Vendor | The vendor of the implementation.
パッケージシール関連ヘッダー:
また、JAR ファイル内の特定のパッケージをシールする必要があるかどうかを指定することもできます。つまり、そのパッケージで定義されているすべてのクラスを同じ JAR ファイルにアーカイブする必要があります。これは、'Sealed' ヘッダーを使用して指定できます。
名前: {package/some-package/} Sealed:true
ここで、パッケージ名は「/」で終わる必要があります。
マニフェスト ファイルによるセキュリティの強化:
マニフェスト ファイル エントリを使用して、「Permissions」、「Codebae」、「Application-Name」、「Trusted-Only」などのさまざまな属性でパッケージ化された Web アプリケーションまたはアプレットのセキュリティを確保できます。
META-INF フォルダー:
このフォルダーは、マニフェスト ファイルが存在する場所です。また、アプリケーションに関するメタデータを含むファイルをさらに含めることもできます。たとえば、EJB モジュール JAR ファイルでは、このフォルダーには、JAR のマニフェスト ファイルと共に EJB モジュールの EJB デプロイメント記述子が含まれます。また、それが実行されるアプリケーション サーバーの具体的なコンテナ リソースへの抽象 EJB 参照のマッピングを含む xml ファイルも含まれます。
参照:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html