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?
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.
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.
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 :-)
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.
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
Le fichier /META-INF/MANIFEST.MF a une signification particulière:
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
.Java.lang.Package.getPackage("org.myserver").getImplementationTitle()
.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.
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.
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.
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
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
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.
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