Qual è lo scopo di META-INF?


Risposte:


65

In generale, non dovresti inserire nulla in META-INF. Invece, dovresti fare affidamento su qualsiasi cosa tu usi per impacchettare il tuo JAR. Questa è una delle aree in cui penso che Ant eccelli davvero: specificare gli attributi manifest del file JAR. È molto facile dire qualcosa del tipo:

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

Almeno, penso che sia facile ... :-)

Il punto è che META-INF dovrebbe essere considerato una meta directory Java interna . Non scherzare! Tutti i file che si desidera includere con il proprio JAR dovrebbero essere collocati in qualche altra sottodirectory o nella radice del JAR stesso.


17
E i servizi? Descrittori di librerie di tag? Mettere qualcosa nella radice di un JAR è una cattiva idea. In assenza di una chiara convenzione, è troppo probabile che le risorse nella radice si scontrino.
Erickson,

13
Se stai usando JPA, devi inserire persistence.xml in quella cartella, è qualcosa che non accade automaticamente.
JRSofty,

4
Questa sarebbe una buona risposta, tranne per il fatto che in una semplice app Spring MVC, META-INF è l'unica directory in cui è possibile fare riferimento ai file di configurazione sia dai test unitari che dai controller. Se un'altra directory funzionasse sarebbe fantastico - non funziona (almeno non in modo semplice). Per me, costruire un file Jar solo per testare un file di guerra è come costruire un'auto in modo da poter andare a piedi in cucina. Almeno per me. Ma ho trascorso un po 'di tempo a fare Ruby e potrebbero avermi rovinato per quanto riguarda i file di configurazione (anche se scambierò un po' di inferno XML per sapere quali sono i tipi dei miei parametri). :)
John Lockwood,

Puoi darci qualche esempio sui tipi di file che dovrebbe contenere questa cartella?
Menai Ala Eddine - Aladdin,

3
Questo non risponde a ciò che è META-INF. Se avessi una risposta a ciò, allora forse potrei giudicare se mettere qualcosa in quella cartella non debba "mai" essere fatto da solo.
Kröw,

164

Dalla specifica del file JAR ufficiale (il collegamento va alla versione Java 7, ma il testo non è cambiato almeno dalla v1.3):

La directory META-INF

I seguenti file / directory nella directory META-INF sono riconosciuti e interpretati dalla piattaforma Java 2 per configurare applicazioni, estensioni, caricatori di classi e servizi:

  • MANIFEST.MF

Il file manifest utilizzato per definire i dati relativi all'estensione e al pacchetto.

  • INDEX.LIST

Questo file è generato dalla nuova " -i" opzione dello strumento jar, che contiene informazioni sulla posizione per i pacchetti definiti in un'applicazione o in un'estensione. Fa parte dell'implementazione JarIndex e viene utilizzato dai programmi di caricamento classi per accelerare il processo di caricamento della classe.

  • x.SF

Il file della firma per il file JAR. 'x' indica il nome del file di base.

  • x.DSA

Il file di blocco della firma associato al file di firma con lo stesso nome del file di base. Questo file memorizza la firma digitale del file della firma corrispondente.

  • services/

Questa directory memorizza tutti i file di configurazione del fornitore di servizi.


3
Anche i TLD devono rientrare nel META-INF.
Erickson,

@erickson, Elaborate?
Pacerier,

I descrittori della libreria di tag @Pacerier per le librerie di tag JSP devono trovarsi nella directory META-INF. Avevo dimenticato cosa rappresentava TLD nel 2008.
Erickson,

27

Ho notato che alcune librerie Java hanno iniziato a utilizzare META-INF come directory in cui includere i file di configurazione che dovrebbero essere impacchettati e inclusi nel CLASSPATH insieme ai JAR. Ad esempio, Spring consente di importare file XML che si trovano sul percorso di classe utilizzando:

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

In questo esempio, sto citando direttamente dalla Guida dell'utente di Apache CXF . Su un progetto a cui ho lavorato in cui dovevamo consentire più livelli di configurazione tramite Spring, abbiamo seguito questa convenzione e messo i nostri file di configurazione in META-INF.

Quando rifletto su questa decisione, non so cosa sarebbe esattamente sbagliato semplicemente includendo i file di configurazione in uno specifico pacchetto Java, piuttosto che in META-INF. Ma sembra essere uno standard di fatto emergente; o quello o un anti-pattern emergente :-)


4
Configuraton non appartiene a una libreria. Penso che tu l'abbia inchiodato con "anti-pattern emergente". È davvero abbastanza facile individuare i file di configurazione relativi a una libreria; non hanno bisogno di andare fisicamente nello stesso JAR per essere trovati.
Erickson,

24
Non sono d'accordo con l'affermazione che la configurazione non appartiene a una libreria. Penso che la configurazione, specialmente quando si tratta di impostazioni predefinite, sia ben confezionata in una libreria. Sono davvero contento che più framework abbiano scelto di lavorare in questo modo invece di costringerti a includere tutti i tipi di file di configurazione esterni come era comune non molto tempo fa.
Eelco,

1
Ho visto molti file di tipo LICENSE.TXT visualizzati anche in META_INF, che trovo fastidiosi.
Ti Strga,

@Eelco, codice e dati non devono mescolarsi. Includere file di configurazione esterni non significa necessariamente un pasticcio di usabilità. Dipende da come è strutturato.
Pacerier,

1
È una cosa abbastanza arbitraria dichiarare @Pacerier. Come affermazione generale, è in gran parte preferenza.
Eelco,

13

La cartella META-INF è la home per il file MANIFEST.MF . Questo file contiene metadati sul contenuto del JAR. Ad esempio, esiste una voce chiamata Main-Class che specifica il nome della classe Java con il main statico () per i file JAR eseguibili.


10

Puoi anche inserire risorse statiche lì.

Per esempio:

META-INF/resources/button.jpg 

e ottenerli nel contenitore web3.0 tramite

http://localhost/myapp/button.jpg

> Leggi di più

Il /META-INF/MANIFEST.MF ha un significato speciale:

  1. Se si esegue un jar usando java -jar myjar.jar org.myserver.MyMainClassè possibile spostare la definizione della classe principale nel jar in modo da ridurre la chiamata java -jar myjar.jar.
  2. È possibile definire Metainformations per pacchetti se si utilizza java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Puoi fare riferimento ai certificati digitali che desideri utilizzare in modalità Applet / Webstart.

Quindi qualsiasi elemento statico nell'applicazione dovrebbe essere inserito in questa directory come immagini o altri elementi.
Menai Ala Eddine - Aladdin,

6

META-INF a Maven

In Maven la cartella META-INF è compresa a causa del layout di directory standard , che per convenzione convenziona le risorse del progetto all'interno di JAR: tutte le directory o i file inseriti nella directory $ {basedir} / src / main / resources sono impacchettati nel tuo JAR con la stessa identica struttura a partire dalla base del JAR. La cartella $ {basedir} / src / main / resources / META-INF di solito contiene file .properties mentre nel vaso contiene un MANIFEST.MF generato , pom.properties , il pom.xml , tra gli altri file. Anche i framework come Spring usano classpath:/META-INF/resources/per servire le risorse web. Per ulteriori informazioni, vedereCome faccio ad aggiungere risorse al mio progetto Maven .


5

Solo per aggiungere alle informazioni qui, nel caso di un file WAR, il file META-INF / MANIFEST.MF fornisce allo sviluppatore una funzione per avviare un controllo del tempo di distribuzione dal contenitore che assicura che il contenitore possa trovare tutte le classi dell'applicazione dipende da. Ciò garantisce che nel caso in cui si sia perso un JAR, non è necessario attendere fino a quando l'applicazione non viene scaricata durante l'esecuzione per rendersi conto che manca.


5

Ho pensato a questo problema di recente. Non sembra esserci alcuna restrizione sull'uso di META-INF. Ci sono alcune restrizioni, ovviamente, sulla necessità di mettere lì il manifest, ma non sembra esserci alcun divieto di mettere lì altre cose.

Perché è così?

Il caso cxf può essere legittimo. Ecco un altro posto in cui questo non standard è raccomandato per aggirare un brutto bug in JBoss-ws che impedisce la validazione sul lato server contro lo schema di un wsdl.

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

Ma in realtà non sembrano esserci standard, né tu-non-non. Di solito queste cose sono definite in modo molto rigoroso, ma per qualche ragione, sembra che non ci siano standard qui. Dispari. Sembra che META-INF sia diventato un luogo ideale per qualsiasi configurazione necessaria che non può essere facilmente gestita in altro modo.


5

Aggiungendo alle informazioni qui, META-INF è una cartella speciale che ClassLoadertratta diversamente dalle altre cartelle nel vaso. Gli elementi nidificati all'interno della cartella META-INF non vengono mescolati con gli elementi esterni.

Pensalo come un'altra radice. Dalla Enumerator<URL> ClassLoader#getSystemResources(String path)prospettiva method et al:

Quando il percorso specificato inizia con "META-INF", il metodo cerca le risorse che sono nidificate all'interno delle cartelle META-INF di tutti i barattoli nel percorso di classe.

Quando il percorso specificato non inizia con "META-INF", il metodo cerca le risorse in tutte le altre cartelle (al di fuori del META-INF) di tutti i barattoli e le directory nel percorso della classe.

Se conosci un altro nome di cartella che il getSystemResourcesmetodo tratta in modo speciale, ti preghiamo di commentarlo.


3

Se stai usando JPA1, potresti dover inserire un persistence.xmlfile che specifica il nome di un'unità di persistenza che potresti voler usare. Un'unità di persistenza fornisce un modo conveniente per specificare un insieme di file di metadati, classi e barattoli che contengono tutte le classi da conservare in un raggruppamento.

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Scopri di più qui: http://www.datanucleus.org/products/datanucleus/jpa/emf.html


1

Tutte le risposte sono corrette Meta-inf ha molti scopi. Inoltre, ecco un esempio sull'uso del contenitore Tomcat.

Vai a Tomcat Doc e seleziona l' attributo " Implementazione standard> copyXML ".

La descrizione è sotto.

Impostare su true se si desidera che un descrittore XML di contesto incorporato nell'applicazione (disponibile in /META-INF/context.xml) venga copiato nella base xml dell'host proprietaria quando l'applicazione viene distribuita. Agli avvii successivi, il descrittore XML di contesto copiato verrà utilizzato preferibilmente a qualsiasi descrittore XML di contesto incorporato nell'applicazione anche se il descrittore incorporato nell'applicazione è più recente. Il valore della bandiera viene impostato automaticamente su falso. Nota se l'attributo deployXML dell'host proprietario è falso o se l'attributo copyXML dell'host proprietario è vero, questo attributo non avrà alcun effetto.


0

Hai file MANIFEST.MF nella cartella META-INF. È possibile definire dipendenze opzionali o esterne a cui è necessario avere accesso.

Esempio:

Considera di aver distribuito la tua app e il tuo contenitore (in fase di esecuzione) ha scoperto che la tua app richiede una versione più recente di una libreria che non si trova all'interno della cartella lib, in tal caso se hai definito la versione più recente opzionale, la MANIFEST.MFtua app farà riferimento alla dipendenza da lì (e non andrà in crash).

Source: Head First Jsp e Servlet


1
Non è chiaro quanto di questo sia citato dalla fonte e non sembra testuale. Rimossa la bizzarra formattazione. Non utilizzare la formattazione del codice per il testo che non è codice. Usa la formattazione del preventivo per il testo tra virgolette.
Marchese di Lorne,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.