web-dev-qa-db-ja.com

JavaでのMANIFEST.MFファイルの使用

JAR、WAR、およびEARファイルには、MANIFEST.MFフォルダーの下にMETA-INFファイルがあります。

MANIFEST.MFファイルの用途は何ですか?このファイルで指定できるものは何ですか?

80
Anand

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ファイル)を参照します。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に関連して指定されます。

Package Sealing: JARファイル内のパッケージは、オプションでシールできます。つまり、そのパッケージで定義されているすべてのクラスを同じJARファイルにアーカイブする必要があります。パッケージは、ソフトウェアのクラス間またはセキュリティ対策としてバージョンの一貫性を確保するために封印される場合があります。パッケージを封印するには、次のように、パッケージにNameヘッダーを追加し、その後にSealedヘッダーを追加する必要があります。

Name: myCompany/myPackage/
Sealed: true

Nameヘッダーの値は、パッケージの相対パス名です。ファイル名と区別するために「/」で終わることに注意してください。 Nameヘッダーに続くヘッダーは、間に空白行を挿入することなく、Nameヘッダーで指定されたファイルまたはパッケージに適用されます。上の例では、Name:myCompany/myPackageヘッダーの後にSealedヘッダーがあり、間に空白行がないため、SealedヘッダーはパッケージmyCompany/myPackageに適用される(のみ)と解釈されます。

パッケージのバージョン管理:パッケージのバージョン管理仕様は、バージョン管理情報を保持するためにいくつかのマニフェストヘッダーを定義しています。そのようなヘッダーのセットを各パッケージに割り当てることができます。バージョン管理ヘッダーは、パッケージの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."
81
Frank

Manifest.MFには、JARファイルに含まれるファイルに関する情報が含まれています。

JARファイルが作成されるたびに、デフォルトのmanifest.mfファイルがMETA-INFフォルダー内に作成され、次のようなデフォルトのエントリが含まれます。

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)

これらは、「header:value」ペアとしてのエントリです。 1つ目はマニフェストバージョンを指定し、2つ目はJARファイルが作成されるJDKバージョンを指定します。

Main-Classヘッダー:JARファイルを使用してアプリケーションをパッケージにバンドルする場合、アプリケーションのエントリポイントを提供するクラスを指定する必要があります。マニフェストファイルの「Main-Class」ヘッダーを使用してこの情報を提供し、

メインクラス:{完全修飾クラス名}

ここでの「Main-Class」値は、mainメソッドを持つクラスです。このエントリを指定したら、JARファイルを実行してアプリケーションを実行できます。

Class-Pathヘッダー:ほとんどの場合、アプリケーションのJARファイル内にパッケージ化されたクラスから他のJARファイルにアクセスする必要があります。これは、「Class-Path」ヘッダーを使用してマニフェストファイルで完全修飾パスを提供することで実行できます。

クラスパス:{jar1-name jar2-name directory-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ファイルにアーカイブする必要があります。これは、「シール」ヘッダーを使用して指定できます。

名前:{package/some-package /} Sealed:true

ここでは、パッケージ名は「/」で終わる必要があります。

マニフェストファイルによるセキュリティの強化:

マニフェストファイルエントリを使用して、Webアプリケーションのセキュリティを確保したり、「Permissions」、「Codebae」、「Application-Name」、「Trusted-Only」などのさまざまな属性を含むアプレットをパッケージ化します。

META-INFフォルダー:

このフォルダーは、マニフェストファイルが存在する場所です。また、アプリケーションに関するメタデータを含むファイルをさらに含めることができます。たとえば、EJBモジュールJARファイルでは、このフォルダーには、JARのマニフェストファイルとともに、EJBモジュールのEJBデプロイメント記述子が含まれています。また、実行されるアプリケーションサーバーの具体的なコンテナリソースへの抽象EJB参照のマッピングを含むxmlファイルが含まれています。

参照:
https://docs.Oracle.com/javase/tutorial/deployment/jar/manifestindex.html

17
jordom