web-dev-qa-db-fra.com

Quel est le but de META-INF?

En Java, vous voyez souvent un dossier META-INF contenant des méta-fichiers. Quel est le but de ce dossier et que puis-je y mettre?

274
Kristian

De manière générale, vous ne devez rien ajouter vous-même dans META-INF. Au lieu de cela, vous devez vous fier à tout ce que vous utilisez pour emballer votre fichier JAR. C’est l’un des domaines dans lesquels je pense qu’Ant excelle vraiment: spécifier les attributs de fichier manifeste JAR. Il est très facile de dire quelque chose comme:

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

Au moins, je pense que c'est facile ... :-)

Le fait est que META-INF doit être considéré comme un répertoire interne Java meta. Ne plaisante pas avec ça! Tous les fichiers que vous souhaitez inclure dans votre fichier JAR doivent être placés dans un autre sous-répertoire ou à la racine du fichier JAR lui-même.

62
Daniel Spiewak

Depuis spécification officielle du fichier JAR (le lien permet d'accéder à la version Java 7, mais le texte n'a pas changé depuis au moins la v1.3):

Le répertoire META-INF

Les fichiers/répertoires suivants du répertoire META-INF sont reconnus et interprétés par la plate-forme Java 2 pour configurer des applications, des extensions, des chargeurs de classes et des services:

  • MANIFEST.MF

Le fichier manifeste utilisé pour définir les données relatives aux extensions et aux packages.

  • INDEX.LIST

Ce fichier est généré par la nouvelle option "-i" de l'outil jar, qui contient des informations d'emplacement pour les packages définis dans une application ou une extension. Il fait partie de l'implémentation de JarIndex et est utilisé par les chargeurs de classes pour accélérer leur processus de chargement de classes.

  • x.SF

Le fichier de signature pour le fichier JAR. 'x' représente le nom du fichier de base.

  • x.DSA

Le fichier de bloc de signature associé au fichier de signature portant le même nom de fichier de base. Ce fichier stocke la signature numérique du fichier de signature correspondant.

  • services/

Ce répertoire contient tous les fichiers de configuration du fournisseur de services.

159
aku

J'ai remarqué que certaines bibliothèques Java ont commencé à utiliser META-INF en tant que répertoire dans lequel inclure les fichiers de configuration devant être empaquetés et inclus dans le CLASSPATH avec les fichiers JAR. Par exemple, Spring vous permet d'importer des fichiers XML situés sur le chemin de classe à l'aide de:

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

Dans cet exemple, je cite directement à partir de Guide de l'utilisateur Apache CXF . Sur un projet sur lequel j'ai dû autoriser plusieurs niveaux de configuration via Spring, nous avons suivi cette convention et avons placé nos fichiers de configuration dans META-INF.

Lorsque je réfléchis à cette décision, je ne sais pas ce qui serait vraiment faux de simplement inclure les fichiers de configuration dans un package Java spécifique, plutôt que dans META-INF. Mais cela semble être un standard émergent de facto; soit ça, soit un anti-pattern émergent :-)

25
user38748

Le dossier META-INF est la base du fichier MANIFEST.MF . Ce fichier contient des métadonnées sur le contenu du fichier JAR. Par exemple, une entrée appelée Main-Class spécifie le nom de la classe Java avec le paramètre static main () pour les fichiers JAR exécutables.

10
Brian Matthews

Vous pouvez également y placer des ressources statiques.

Par exemple:

META-INF/resources/button.jpg 

et les obtenir dans web3.0-container via

http://localhost/myapp/button.jpg

> En savoir plus

Le fichier /META-INF/MANIFEST.MF a une signification particulière:

  1. Si vous exécutez un fichier jar à l'aide de Java -jar myjar.jar org.myserver.MyMainClass, vous pouvez déplacer la définition de la classe principale dans le fichier jar afin de réduire l'appel en Java -jar myjar.jar.
  2. Vous pouvez définir des métainformations en packages si vous utilisez Java.lang.Package.getPackage("org.myserver").getImplementationTitle().
  3. Vous pouvez référencer les certificats numériques que vous souhaitez utiliser en mode Applet/Webstart.
8
Peter Rader

Pour ajouter aux informations ici, dans le cas d’un fichier WAR, le fichier META-INF/MANIFEST.MF fournit au développeur une fonction permettant de lancer une vérification de la durée du déploiement par le conteneur afin de garantir que celui-ci puisse trouver toutes les classes de votre application. dépend de. Cela garantit que, si vous avez manqué un fichier JAR, vous n'avez pas à attendre que votre application explose au moment de l'exécution pour vous rendre compte de son absence.

4
sasuke

En ajoutant aux informations ici, META-INF est un dossier spécial que la ClassLoader traite différemment des autres dossiers du fichier jar. Les éléments imbriqués dans le dossier META-INF ne sont pas mélangés avec les éléments situés en dehors de celui-ci.

Pensez-y comme une autre racine. Dans la perspective Enumerator<URL> ClassLoader#getSystemResources(String path) method et al:

Lorsque le chemin indiqué commence par "META-INF", la méthode recherche les ressources imbriquées dans les dossiers META-INF de tous les fichiers JAR du chemin de classe.

Lorsque le chemin donné ne commence pas par "META-INF", la méthode recherche les ressources dans tous les autres dossiers (en dehors du META-INF) de tous les fichiers jar et répertoires du chemin de classe.

Si vous connaissez un autre nom de dossier que la méthode getSystemResources traite spécialement, veuillez faire un commentaire à ce sujet.

4
Readren

J'ai réfléchi à cette question récemment. Il ne semble vraiment pas y avoir de restriction d'utilisation de META-INF. Bien sûr, il existe certaines restrictions quant à la nécessité de placer le manifeste ici, mais il ne semble pas y avoir d’interdiction de placer d’autres documents.

Pourquoi est-ce le cas?

Le cas cxf peut être légitime. Voici un autre endroit où cette méthode non standard est recommandée pour contourner un mauvais bogue dans JBoss-ws qui empêche la validation côté serveur contre le schéma d'un wsdl.

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

Mais il ne semble vraiment pas y avoir de normes, de tu ne veux pas. Habituellement, ces choses sont définies de manière très rigoureuse, mais pour une raison quelconque, il semble qu’il n’y ait pas de normes ici. Impair. Il semble que META-INF soit devenu un lieu de prédilection pour toute configuration nécessaire difficile à gérer autrement.

4
Steve Cohen

META-INF à Maven

Dans Maven, le dossier META-INF est compris en raison de la convention mise en page de répertoire standard qui met en convention par nom les ressources de votre projet dans les JAR. : tous les répertoires ou fichiers placés dans le répertoire $ {basedir}/src/main/resources sont regroupés dans votre JAR avec exactement la même structure, à partir de la base du JAR. Le dossier $ {basedir}/src/main/resources/META-INF contient généralement . Properties des fichiers dans le fichier jar contient a généré MANIFEST.MF , pom.properties , le pom.xml , entre autres fichiers. Les frameworks tels que Spring utilisent classpath:/META-INF/resources/ pour servir les ressources Web. Pour plus d'informations, voir Comment puis-je ajouter des ressources à mon projet Maven

4
EliuX

Si vous utilisez JPA1, vous devrez peut-être y déposer un fichier persistence.xml, qui spécifie le nom d'une unité de persistance à utiliser. Une unité de persistance constitue un moyen pratique de spécifier un ensemble de fichiers de métadonnées, de classes et de fichiers JAR contenant toutes les classes à conserver dans un groupe.

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

// ...

EntityManagerFactory emf =
      Persistence.createEntityManagerFactory(persistenceUnitName);

Voir plus ici: http://www.datanucleus.org/products/datanucleus/jpa/emf.html

3
f0ster

Toutes les réponses sont correctes. Meta-inf a plusieurs objectifs. De plus, voici un exemple d'utilisation du conteneur Tomcat.

Allez à Tomcat Doc et cochez l'attribut " Standard Implementation> copyXML ".

La description est ci-dessous.

Définissez la valeur true si vous souhaitez qu'un descripteur XML de contexte incorporé dans l'application (situé à l'emplacement /META-INF/context.xml) soit copié dans la base xmlBase de l'hôte propriétaire lors du déploiement de l'application. Lors des démarrages suivants, le descripteur XML de contexte copié sera utilisé de préférence à tout descripteur XML de contexte incorporé dans l'application même si le descripteur incorporé dans l'application est plus récent. La valeur par défaut du drapeau est false. Remarque Si l'attribut deployXML de l'hôte propriétaire est false ou si l'attribut copyXML de l'hôte propriétaire est true, cet attribut n'aura aucun effet.

1
Tugrul

Vous avez le fichier MANIFEST.MF dans votre dossier META-INF. Vous pouvez définir des dépendances optionnelles ou externes auxquelles vous devez avoir accès.

Exemple:

Considérez que vous avez déployé votre application et que votre conteneur (au moment de l'exécution) a découvert que votre application nécessite une version plus récente d'une bibliothèque qui ne se trouve pas dans le dossier lib, si vous avez défini la version plus récente facultative dans MANIFEST.MF alors votre application fera référence à la dépendance à partir de là (et ne plantera pas).

Source: Head First Jsp & Servlet

0
Prateek Joshi