it-swarm-eu.dev

Was ist der Zweck von META-INF?

In Java wird häufig ein META-INF-Ordner mit einigen Metadateien angezeigt. Was ist der Zweck dieses Ordners und was kann ich dort ablegen?

274
Kristian

Im Allgemeinen sollten Sie META-INF nicht selbst mit Daten füllen. Stattdessen sollten Sie sich auf alles verlassen, was Sie zum Packen Ihrer JAR verwenden. Dies ist einer der Bereiche, in denen sich Ant meines Erachtens wirklich auszeichnet: die Angabe von Manifest-Attributen für JAR-Dateien. Es ist sehr einfach, etwas zu sagen wie:

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

Zumindest finde ich das einfach ... :-)

Der Punkt ist, dass META-INF als internes Java meta Verzeichnis betrachtet werden sollte. Verwirren Sie sich nicht damit! Alle Dateien, die Sie in Ihre JAR aufnehmen möchten, sollten es sein in einem anderen Unterverzeichnis oder im Stammverzeichnis der JAR selbst abgelegt werden.

62
Daniel Spiewak

Von die offizielle JAR-Dateispezifikation (Link geht zur Java 7 Version, aber der Text hat sich seit mindestens v1.3 nicht geändert):

Das META-INF-Verzeichnis

Die folgenden Dateien/Verzeichnisse im META-INF-Verzeichnis werden von der Java 2 Platform zum Konfigurieren von Anwendungen, Erweiterungen, Klassenladeprogrammen und Diensten erkannt und interpretiert:

  • MANIFEST.MF

Die Manifestdatei, mit der Erweiterungs- und paketbezogene Daten definiert werden.

  • INDEX.LIST

Diese Datei wird vom neuen "-i "Option des jar-Tools, die Standortinformationen für in einer Anwendung oder Erweiterung definierte Pakete enthält. Sie ist Teil der JarIndex-Implementierung und wird von Klassenladeprogrammen verwendet, um den Ladevorgang ihrer Klassen zu beschleunigen.

  • x.SF

Die Signaturdatei für die JAR-Datei. 'x' steht für den Basisdateinamen.

  • x.DSA

Die Signaturblockdatei, die der Signaturdatei mit demselben Basisdateinamen zugeordnet ist. Diese Datei speichert die digitale Signatur der entsprechenden Signaturdatei.

  • services/

In diesem Verzeichnis werden alle Konfigurationsdateien des Dienstanbieters gespeichert.

159
aku

Mir ist aufgefallen, dass einige Java - Bibliotheken META-INF als Verzeichnis für Konfigurationsdateien verwenden, die zusammen mit JARs gepackt und in CLASSPATH aufgenommen werden sollen. Dies ist beispielsweise in Spring möglich Sie importieren XML-Dateien, die sich im Klassenpfad befinden, mit:

<import resource="classpath:/META-INF/cxf/cxf.xml" />
<import resource="classpath:/META-INF/cxf/cxf-extensions-*.xml" />

In diesem Beispiel zitiere ich direkt aus dem Apache CXF User Guide . An einem Projekt, an dem ich gearbeitet habe, mussten wir über Spring mehrere Konfigurationsebenen zulassen. Wir folgten dieser Konvention und legten unsere Konfigurationsdateien in META-INF ab.

Wenn ich über diese Entscheidung nachdenke, weiß ich nicht genau, was falsch wäre, wenn ich die Konfigurationsdateien einfach in ein bestimmtes Java) - Paket anstatt in META-INF einbinde. Aber es scheint so ein aufstrebender De-facto-Standard, entweder das oder ein aufstrebendes Anti-Pattern :-)

25
user38748

Im Ordner META-INF befindet sich die Datei MANIFEST.MF . Diese Datei enthält Metadaten zum Inhalt der JAR. Beispielsweise gibt es einen Eintrag namens Main-Class, der den Namen der Java class mit dem static main () für ausführbare JAR-Dateien angibt.

10
Brian Matthews

Sie können dort auch statische Ressourcen platzieren.

Zum Beispiel:

META-INF/resources/button.jpg 

und hol sie dir im web3.0-container via

http://localhost/myapp/button.jpg

> Weiterlesen

Die Datei /META-INF/MANIFEST.MF hat eine besondere Bedeutung:

  1. Wenn Sie eine JAR-Datei mit Java -jar myjar.jar org.myserver.MyMainClass Ausführen, können Sie die Hauptklassendefinition in die JAR-Datei verschieben, um den Aufruf auf Java -jar myjar.jar Zu verkleinern.
  2. Sie können Metainformationen zu Paketen definieren, wenn Sie Java.lang.Package.getPackage("org.myserver").getImplementationTitle() verwenden.
  3. Sie können auf digitale Zertifikate verweisen, die Sie im Applet-/Webstart-Modus verwenden möchten.
8
Peter Rader

Um die Informationen hier im Fall einer WAR-Datei zu ergänzen, bietet die Datei META-INF/MANIFEST.MF dem Entwickler die Möglichkeit, eine Überprüfung der Bereitstellungszeit durch den Container zu initiieren, um sicherzustellen, dass der Container alle Klassen Ihrer Anwendung finden kann kommt drauf an. Dies stellt sicher, dass Sie nicht warten müssen, bis Ihre Anwendung zur Laufzeit durchgebrannt ist, wenn Sie eine JAR verpasst haben, um zu erkennen, dass sie fehlt.

4
sasuke

Das META-INF ist ein spezieller Ordner, den das ClassLoader anders behandelt als andere Ordner im Jar. Elemente, die im Ordner META-INF verschachtelt sind, werden nicht mit den Elementen außerhalb des Ordners gemischt.

Stellen Sie es sich wie eine andere Wurzel vor. Aus der Perspektive von Enumerator<URL> ClassLoader#getSystemResources(String path) et al .:

Wenn der angegebene Pfad mit "META-INF" beginnt, sucht die Methode nach Ressourcen, die in den META-INF-Ordnern aller Gläser im Klassenpfad verschachtelt sind.

Wenn der angegebene Pfad nicht mit "META-INF" beginnt, sucht die Methode in allen anderen Ordnern (außerhalb von META-INF) aller Jars und Verzeichnisse im Klassenpfad nach Ressourcen.

Wenn Sie einen anderen Ordnernamen kennen, den die getSystemResources -Methode speziell behandelt, kommentieren Sie diesen bitte.

4
Readren

Ich habe in letzter Zeit über dieses Problem nachgedacht. Es scheint wirklich keine Einschränkung für die Verwendung von META-INF zu geben. Es gibt natürlich gewisse Einschränkungen bezüglich der Notwendigkeit, das Manifest dort abzulegen, aber es scheint kein Verbot zu geben, andere Dinge dort abzulegen.

Warum ist das so?

Der Fall cxf kann legitim sein. Hier ist eine weitere Stelle, an der diese Nicht-Norm empfohlen wird, um einen üblen Fehler in JBoss-ws zu umgehen, der die serverseitige Überprüfung anhand des Schemas einer WSDL verhindert.

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

Aber es scheint wirklich keine Maßstäbe zu geben, keine. Normalerweise sind diese Dinge sehr streng definiert, aber aus irgendeinem Grund scheint es hier keine Standards zu geben. Ungerade. Es sieht so aus, als ob META-INF zu einem Sammelpunkt für jede benötigte Konfiguration geworden ist, die nicht einfach auf andere Weise gehandhabt werden kann.

4
Steve Cohen

META-INF in Maven

In Maven wird der Ordner META-INF aufgrund des Standard Directory Layout verstanden, mit dem Ihre Projektressourcen per Namenskonvention in JARs gepackt werden : Alle Verzeichnisse oder Dateien, die sich im Verzeichnis $ {basedir}/src/main/resources befinden, werden in Ihre JAR-Datei mit genau derselben Struktur gepackt, beginnend an der Basis der JAR-Datei. Der Ordner $ {basedir}/src/main/resources/META-INF enthält normalerweise . Properties Dateien, während sich im jar eine generierte MANIFEST.MF , pom.properties , the pom.xml , unter anderem Dateien. Auch Frameworks wie Spring benutzen classpath:/META-INF/resources/, um Webressourcen bereitzustellen. Weitere Informationen finden Sie unter Wie füge ich meinem Maven-Projekt Ressourcen hinzu?

4
EliuX

Wenn Sie JPA1 verwenden, müssen Sie möglicherweise ein persistence.xml Datei, die den Namen einer Persistenzeinheit angibt, die Sie verwenden möchten. Eine Persistenz-Einheit bietet eine bequeme Möglichkeit, eine Reihe von Metadatendateien sowie Klassen und Jars anzugeben, die alle Klassen enthalten, die in einer Gruppierung persistent sein sollen.

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Weitere Informationen finden Sie hier: http://www.datanucleus.org/products/datanucleus/jpa/emf.html

3
f0ster

Alle Antworten sind richtig. Meta-inf hat viele Zwecke. Darüber hinaus finden Sie hier ein Beispiel zur Verwendung des Tomcat-Containers.

Gehen Sie zu Tomcat Doc und überprüfen Sie das Attribut " Standardimplementierung> copyXML ".

Beschreibung ist unten.

Setzen Sie diesen Wert auf true, wenn Sie möchten, dass ein in die Anwendung eingebetteter Kontext-XML-Deskriptor (unter /META-INF/context.xml) bei der Bereitstellung der Anwendung in die xmlBase des besitzenden Hosts kopiert wird. Bei nachfolgenden Starts wird der kopierte Kontext-XML-Deskriptor vor allen in die Anwendung eingebetteten Kontext-XML-Deskriptoren verwendet, selbst wenn der in die Anwendung eingebettete Deskriptor neuer ist. Der Standardwert des Flags ist false. Beachten Sie, dass dieses Attribut keine Auswirkung hat, wenn das Attribut "deployXML" des besitzenden Hosts "false" ist oder wenn das Attribut "copyXML" des besitzenden Hosts "true" ist.

1
Tugrul

Sie haben die MANIFEST.MF-Datei in Ihrem META-INF-Ordner. Sie können optionale oder externe Abhängigkeiten definieren, auf die Sie Zugriff haben müssen.

Beispiel:

Angenommen, Sie haben Ihre App bereitgestellt und Ihr Container (zur Laufzeit) hat festgestellt, dass für Ihre App eine neuere Version einer Bibliothek erforderlich ist, die sich nicht im Ordner lib befindet. In diesem Fall haben Sie die optionale neuere Version in MANIFEST.MF dann verweist Ihre App von dort auf die Abhängigkeit (und stürzt nicht ab).

Source: Head First Jsp & Servlet

0
Prateek Joshi