web-dev-qa-db-ja.com

META-INFの目的は何ですか?

Javaでは、メタファイルを含むMETA-INFフォルダがよく見られます。このフォルダの目的は何ですか?またそこに何を置くことができますか?

267
Kristian

一般的に言って、あなたは自分自身でMETA-INFに何かを入れるべきではありません。代わりに、JARをパッケージ化するために使用するものはすべて信頼する必要があります。これは、Antが本当に優れていると思う分野の1つです。JARファイルのマニフェスト属性を指定することです。次のように言うのはとても簡単です。

<jar ...>
    <manifest>
        <attribute name="Main-Class" value="MyApplication"/>
    </manifest>
</jar>

少なくとも、それは簡単だと思います... :-)

要はMETA-INFは内部のJava メタディレクトリと考えるべきです。それを台無しにしないでください! JARに含めたいファイルは、他のサブディレクトリまたはJAR自体のルートに配置する必要があります。

61
Daniel Spiewak

公式のJARファイル仕様 から(リンクはJava 7バージョンに行きますが、テキストは少なくともv1.3以来変わっていません):

META-INFディレクトリ

META-INFディレクトリ内の次のファイル/ディレクトリは、アプリケーション、拡張機能、クラスローダ、およびサービスを設定するためにJava 2プラットフォームによって認識および解釈されます。

  • MANIFEST.MF

拡張子とパッケージ関連のデータを定義するために使用されるマニフェストファイル。

  • INDEX.LIST

このファイルは、jarツールの新しい "-i"オプションによって生成されます。このオプションには、アプリケーションまたは拡張機能で定義されているパッケージの場所情報が含まれています。これはJarIndex実装の一部であり、クラスローダーがクラスローディングプロセスをスピードアップするために使用します。

  • x.SF

JARファイルの署名ファイル。 'x'はベースファイル名を表します。

  • x.DSA

同じ基本ファイル名を持つ署名ファイルに関連付けられた署名ブロックファイル。このファイルには、対応する署名ファイルのデジタル署名が保存されています。

  • services/

このディレクトリには、すべてのサービスプロバイダ設定ファイルが保存されています。

157
aku

私は、いくつかのJavaライブラリがMETA-INFを、JARと共にパッケージ化されCLASSPATHに含まれるべきである設定ファイルを含むディレクトリとして使い始めたことに気づきました。たとえば、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パッケージに構成ファイルを含めるだけでは、何が問題になるのかまったくわかりません。しかし、それは新興の事実上の標準のようです。どちらか、あるいは新興のアンチパターン:-)

25
user38748

META-INFフォルダは、 MANIFEST.MF ファイルのホームです。このファイルには、JARの内容に関するメタデータが含まれています。たとえば、実行可能なJARファイル用の静的main()でJavaクラスの名前を指定するMain-Classというエントリがあります。

10
Brian Matthews

そこに静的リソースを配置することもできます。

例では:

META-INF/resources/button.jpg 

そしてweb3.0-containerでそれらを入手してください。

http://localhost/myapp/button.jpg

>続きを読む

/META-INF/MANIFEST.MFには特別な意味があります。

  1. Java -jar myjar.jar org.myserver.MyMainClassを使用してjarを実行すると、メインクラス定義をjarに移動できるので、呼び出しをJava -jar myjar.jarに縮小できます。
  2. Java.lang.Package.getPackage("org.myserver").getImplementationTitle()を使用すれば、パッケージにメタ情報を定義できます。
  3. アプレット/ Webスタートモードで使用するデジタル証明書を参照できます。
8
Peter Rader

ここに情報を追加するために、WARファイルの場合、META-INF/MANIFEST.MFファイルは開発者にコンテナによるデプロイ時間チェックを開始する機能を提供します。に依存します。これにより、JARを見逃した場合でも、アプリケーションが実行時に無効になることを認識するまで待つ必要がありません。

4
sasuke

ここでの情報に加えて、META-INFはClassLoaderがjar内の他のフォルダーとは異なる方法で扱う特別なフォルダーです。 META-INFフォルダ内にネストされている要素は、その外側の要素と混在することはありません。

別の根のように考えてください。 Enumerator<URL> ClassLoader#getSystemResources(String path)メソッド他の視点から:

指定されたパスが "META-INF"で始まる場合、このメソッドはクラスパス内のすべてのjarファイルのMETA-INFフォルダ内にネストされているリソースを検索します。

指定されたパスが "META-INF"で始まっていない場合、メソッドはクラスパス内のすべてのjarとディレクトリの他のすべてのフォルダ(META-INFの外側)でリソースを検索します。

getSystemResourcesメソッドが特別に扱う別のフォルダ名について知っているなら、それについてコメントしてください。

4
Readren

私は最近この問題について考えています。実際にMETA-INFの使用に制限はないようです。マニフェストをそこに置くことの必要性については、もちろんいくつかの制限がありますが、他のものをそこに置くことに関するいかなる禁止もないようです。

これはなぜでしょうか。

Cxfの場合は合法です。これはJBoss-wsでwsdlのスキーマに対するサーバーサイドのバリデーションを妨げる厄介なバグを回避するためにこの非標準が推奨される別の場所です。

http://community.jboss.org/message/570377#570377

しかし、実際には、標準や他のものはありません。通常、これらのことは非常に厳密に定義されていますが、何らかの理由で、ここには標準がないようです。奇数META-INFは、他の方法では簡単に処理できないような、必要な設定のための包括的な場所になったようです。

4
Steve Cohen

JPA1を使用している場合は、使用したい永続ユニットの名前を指定するpersistence.xmlファイルをそこにドロップする必要があります。永続化単位は、一連のメタデータファイル、クラス、およびグループに永続化されるすべてのクラスを含むjarを指定する便利な方法を提供します。

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

こちらを参照してください: http://www.datanucleus.org/products/datanucleus/jpa/emf.html

3
f0ster

MavenのMETA-INF

Mavenでは、META-INFフォルダは 標準ディレクトリレイアウト のために理解されています。 :$ {basedir}/src/main/resourcesディレクトリ内に配置されたディレクトリまたはファイルはすべて、JARのベースから始まるまったく同じ構造でJARにパッケージ化されます。フォルダ$ {basedir}/src/main/resources/META-INFには、通常。propertiesファイルが含まれています。生成されたMANIFEST.MFpom.propertiespom.xml、その他のファイル。 Spring のようなフレームワークもWebリソースを提供するためにclasspath:/META-INF/resources/を使用します。詳しくは Mavenプロジェクトにリソースを追加するにはどうすればいいですか? を参照してください。

3
EliuX

すべての答えは正しいです。 Meta-infには多くの目的があります。また、これはTomcatコンテナの使用例です。

Tomcat Doc に行き、 "標準実装> copyXML"属性をチェックしてください。

説明は以下のとおりです。

アプリケーションのデプロイ時に、アプリケーション内に埋め込まれたコンテキストXML記述子(/META-INF/context.xmlにある)を所有するホストのxmlBaseにコピーする場合は、trueに設定します。その後の起動時には、コピーされたコンテキストXML記述子は、アプリケーション内に埋め込まれている記述子の方が新しい場合でも、アプリケーション内に埋め込まれているコンテキストXML記述子よりも優先して使用されます。フラグの値はデフォルトでfalseになります。所有しているホストのdeployXML属性がfalseの場合、または所有しているホストのcopyXML属性がtrueの場合、この属性は無効になります。

1
Tugrul

META-INFフォルダ内にMANIFEST.MFファイルがあります。あなたはオプションまたは外部の依存関係を定義するあなたがアクセスする必要があるということができます。

例:

アプリをデプロイし、(実行時に)コンテナーにlibフォルダー内にない新しいバージョンのライブラリが必要であることが判明したとします。その場合、MANIFEST.MFでオプションの新しいバージョンを定義した場合、アプリはそこからの依存関係を参照してください(そしてクラッシュしません)。

Source: He​​ad First Jsp&Servlet

0
Prateek Joshi