Java では、いくつかのメタ ファイルを含む META-INF フォルダーをよく見かけます。このフォルダの目的は何ですか?そこに何を入れることができますか?
13 に答える
公式の JAR ファイル仕様から(リンクは Java 7 バージョンに移動しますが、テキストは少なくとも v1.3 以降変更されていません):
META-INF ディレクトリ
META-INF ディレクトリ内の次のファイル/ディレクトリは、Java 2 プラットフォームによって認識および解釈され、アプリケーション、拡張機能、クラス ローダー、およびサービスを構成します。
MANIFEST.MF
拡張機能とパッケージ関連データを定義するために使用されるマニフェスト ファイル。
INDEX.LIST
このファイルは
-i
、jar ツールの新しい " " オプションによって生成されます。このオプションには、アプリケーションまたは拡張機能で定義されたパッケージの場所情報が含まれています。これは JarIndex 実装の一部であり、クラス ローダーがクラスのロード プロセスを高速化するために使用します。
x.SF
JAR ファイルの署名ファイル。'x' はベース ファイル名を表します。
x.DSA
同じベース ファイル名を持つ署名ファイルに関連付けられた署名ブロック ファイル。このファイルには、対応する署名ファイルのデジタル署名が格納されます。
services/
このディレクトリには、すべてのサービス プロバイダー構成ファイルが格納されます。
JEP 238を実装する Java 9 以降の新機能は、マルチリリース JAR です。サブフォルダが表示されますversions
。これは、異なる Java バージョン用のクラスを 1 つの jar にパッケージ化できる機能です。
一般的に言って、META-INFに自分で何かを入れてはいけません。代わりに、JARのパッケージ化に使用するものに依存する必要があります。これは、Antが本当に優れていると思う分野の1つです。つまり、JARファイルのマニフェスト属性を指定することです。次のようなことを言うのはとても簡単です。
<jar ...>
<manifest>
<attribute name="Main-Class" value="MyApplication"/>
</manifest>
</jar>
少なくとも、それは簡単だと思います... :-)
重要なのは、META-INFは内部Javaメタディレクトリと見なされるべきであるということです。それを台無しにしないでください!JARに含めるファイルは、他のサブディレクトリまたはJAR自体のルートに配置する必要があります。
一部の Java ライブラリは、パッケージ化して JAR とともに CLASSPATH に含める必要がある構成ファイルを含めるディレクトリとして META-INF を使用し始めていることに気付きました。たとえば、Spring では、次を使用してクラスパスにある XML ファイルをインポートできます。
<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />
この例では、Apache CXF User Guideから直接引用しています。Spring を介して複数レベルの構成を許可する必要がある私が取り組んだプロジェクトでは、この規則に従い、構成ファイルを META-INF に置きました。
この決定を振り返ってみると、構成ファイルを META-INF ではなく、特定の Java パッケージに単純に含めることの何が問題になるのかわかりません。しかし、これは事実上の標準になりつつあるようです。それ、または新たなアンチパターンのいずれか:-)
META-INFフォルダーは、MANIFEST.MFファイルのホームです。このファイルには、JARの内容に関するメタデータが含まれています。たとえば、実行可能JARファイルの静的main()を使用してJavaクラスの名前を指定するMain-Classというエントリがあります。
Maven の META-INF
Maven では、META-INFフォルダーはStandard Directory Layoutにより理解されます。これは、命名規則により、プロジェクト リソースを JAR 内にパッケージ化します。 ${basedir}/src/main/resourcesディレクトリ内に配置されたディレクトリまたはファイルは、JAR にパッケージ化されます。 JAR のベースから始まるまったく同じ構造を持ちます。
フォルダー${basedir}/src/main/resources/META-INFには通常.propertiesファイルが含まれますが、jar には生成されたMANIFEST.MF、pom.properties、 pom.xmlなどのファイルが含まれます。また、Springclasspath:/META-INF/resources/
のようなフレームワークは、Web リソースを提供するために使用します。
詳細については、Maven プロジェクトにリソースを追加する方法を参照してください。
そこに静的リソースを配置することもできます。
例:
META-INF/resources/button.jpg
経由でweb3.0-containerにそれらを取得します
http://localhost/myapp/button.jpg
/META-INF/MANIFEST.MF には特別な意味があります。
- を使用して jar を実行すると
java -jar myjar.jar org.myserver.MyMainClass
、メイン クラスの定義を jar に移動できるため、呼び出しを に縮小できますjava -jar myjar.jar
。 - を使用すると、パッケージにメタ情報を定義できます
java.lang.Package.getPackage("org.myserver").getImplementationTitle()
。 - Applet/Webstart モードで使用したいデジタル証明書を参照できます。
ここでの情報に加えて、META-INF はClassLoader
、jar 内の他のフォルダーとは異なる扱いをする特別なフォルダーです。META-INF フォルダー内にネストされた要素は、その外側の要素と混合されません。
別のルートと考えてください。メソッドなどのEnumerator<URL> ClassLoader#getSystemResources(String path)
観点から:
指定されたパスが「META-INF」で始まる場合、メソッドは、クラスパス内のすべての jar の META-INF フォルダー内にネストされているリソースを検索します。
指定されたパスが「META-INF」で始まらない場合、メソッドは、クラスパス内のすべての jar およびディレクトリの他のすべてのフォルダー (META-INF の外側) でリソースを検索します。
メソッドが特別に扱う別のフォルダ名を知っている場合はgetSystemResources
、それについてコメントしてください。
ここに情報を追加すると、WAR ファイルの場合、META-INF/MANIFEST.MF ファイルは開発者に、コンテナーによるデプロイ時間チェックを開始する機能を提供します。これにより、コンテナーはアプリケーションのすべてのクラスを確実に見つけることができます。に依存します。これにより、JAR を見逃した場合でも、実行時にアプリケーションが異常終了するまで待たなくても、JAR が見つからないことがわかります。
私は最近、この問題について考えていました。META-INF の使用に制限はないようです。もちろん、そこにマニフェストを配置する必要性については一定の制限がありますが、そこに他のものを配置することを禁止するものはないようです。
これはなぜですか?
cxf ケースは正当である可能性があります。これは、wsdl のスキーマに対するサーバー側の検証を妨げる JBoss-ws の厄介なバグを回避するために、この非標準が推奨される別の場所です。
http://community.jboss.org/message/570377#570377
しかし、実際には、何の基準もないようです。通常、これらは非常に厳密に定義されていますが、何らかの理由で、ここには基準がないようです。奇数。META-INF は、他の方法では簡単に処理できない必要な構成の包括的な場所になっているようです。
JPA1 を使用している場合は、使用persistence.xml
する永続ユニットの名前を指定するファイルをそこにドロップする必要がある場合があります。persistence-unit は、一連のメタデータ ファイル、クラス、およびグループに保持されるすべてのクラスを含む jar を指定する便利な方法を提供します。
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
// ...
EntityManagerFactory emf =
Persistence.createEntityManagerFactory(persistenceUnitName);
詳細はこちら: http://www.datanucleus.org/products/datanucleus/jpa/emf.html
META-INF フォルダー内に MANIFEST.MF ファイルがあります。アクセスが必要なオプションまたは外部の依存関係を定義できます。
例:
アプリをデプロイし、コンテナー (実行時) が、アプリが lib フォルダー内にないライブラリの新しいバージョンを必要とすることを発見したとします。その場合、オプションの新しいバージョンを定義している場合MANIFEST.MF
、アプリは参照します。そこから依存関係に移動します(クラッシュしません)。
Source:
ヘッド ファースト JSP & サーブレット
さらに、META-INF フォルダーはマルチリリース jarにも使用されるようになりました。これは、異なる Java バージョン用のクラスを 1 つの jar にパッケージ化することを可能にする機能です。たとえば、Java 11 によって提供される新機能を備えた Java 11 のクラスを jar に含めることで、Java 8 用の別のクラスも Java 8 用に機能します。含まれる機能が少ない。たとえば、新しい Java バージョンが、API 違反のために以前のバージョンでは機能しない拡張された、別の、または新しい API メソッドを提供している場合に、これは役立ちます。次に、サブフォルダーが表示されますversions
。