web-dev-qa-db-fra.com

Utilisation du fichier MANIFEST.MF dans Java

J'ai remarqué que les fichiers JAR, WAR et EAR ont un fichier MANIFEST.MF Dans le dossier META-INF.

Quelle est l'utilisation du fichier MANIFEST.MF? Qu'est-ce que toutes les choses peuvent être spécifiées dans ce fichier?

80
Anand

Le contenu du fichier Manifest dans un fichier JAR créé avec la version 1.0 du Java Kit de développement est le suivant.

Manifest-Version: 1.0

Toutes les entrées sont des paires nom-valeur. Le nom d'un en-tête est séparé de sa valeur par deux points. Le manifeste par défaut indique qu'il est conforme à la version 1.0 de la spécification du manifeste. Le manifeste peut également contenir des informations sur les autres fichiers contenus dans l'archive. Les informations de fichier enregistrées dans le manifeste dépendent de l'utilisation prévue du fichier JAR. Le fichier manifeste par défaut ne fait aucune hypothèse sur les informations qu'il doit enregistrer sur les autres fichiers. Par conséquent, sa ligne unique contient des données uniquement sur lui-même. En-têtes de manifeste à usage spécial

Selon le rôle prévu du fichier JAR, il peut être nécessaire de modifier le manifeste par défaut. Si le fichier JAR est créé uniquement à des fins d'archivage, le fichier MANIFEST.MF est inutile. La plupart des utilisations de fichiers JAR vont au-delà de la simple compression et archivage et nécessitent des informations spéciales dans le fichier manifeste. Vous trouverez ci-dessous une brève description des en-têtes nécessaires pour certaines fonctions de fichier JAR à usage spécifique.

Applications groupées sous forme de fichiers JAR: Si une application est groupée dans un fichier JAR, la machine virtuelle Java doit être informée du point d'entrée de l'application. Un Le point d’entrée est une classe avec une méthode publique publique statique (String [] args). Cette information est fournie dans l’en-tête Main-Class, qui a la forme générale suivante:

Main-Class: classname

La valeur classname doit être remplacée par le point d'entrée de l'application.

Download Extensions: Les extensions de téléchargement sont des fichiers JAR qui sont référencés par les fichiers manifestes des autres fichiers JAR. Dans une situation typique, une applet sera intégrée à un fichier JAR dont le manifeste fait référence à un fichier JAR (ou à plusieurs fichiers JAR) qui servira d’extension aux fins de cette applet. Les extensions peuvent se référencer de la même manière. Les extensions de téléchargement sont spécifiées dans le champ d'en-tête Class-Path du fichier manifeste d'un applet, d'une application ou d'une autre extension. Un en-tête de chemin de classe pourrait ressembler à ceci, par exemple:

Class-Path: servlet.jar infobus.jar acme/beans.jar

Avec cet en-tête, les classes des fichiers servlet.jar, infobus.jar et acme/beans.jar serviront d'extensions aux fins de l'applet ou de l'application. Les URL figurant dans l'en-tête Class-Path sont indiquées par rapport à l'URL du fichier JAR de l'applet ou de l'application.

Package Sealing: Un package dans un fichier JAR peut éventuellement être scellé, ce qui signifie que toutes les classes définies dans ce package doivent être archivées dans le même fichier JAR. Un package peut être scellé pour garantir la cohérence des versions entre les classes de votre logiciel ou par mesure de sécurité. Pour sceller un paquet, un en-tête Nom doit être ajouté pour le paquet, suivi d'un en-tête Sealed, similaire à ceci:

Name: myCompany/myPackage/
Sealed: true

La valeur de l'en-tête Name est le chemin d'accès relatif du package. Notez qu'il se termine par un '/' pour le distinguer d'un nom de fichier. Tous les en-têtes qui suivent un en-tête de nom, sans lignes vierges intermédiaires, s'appliquent au fichier ou au package spécifié dans l'en-tête de nom. Dans l'exemple ci-dessus, l'en-tête Sealed apparaissant après l'en-tête Name: myCompany/myPackage, sans lignes vierges, l'en-tête Sealed sera interprété comme s'appliquant (uniquement) au package myCompany/myPackage.

Package Versioning: La spécification Package Versioning définit plusieurs en-têtes de manifeste pour contenir les informations de version. Un ensemble de tels en-têtes peut être affecté à chaque paquet. Les en-têtes de contrôle de version doivent apparaître directement sous l'en-tête Nom du package. Cet exemple montre tous les en-têtes de gestion de versions:

Name: Java/util/
Specification-Title: "Java Utility Classes" 
Specification-Version: "1.2"
Specification-Vendor: "Sun Microsystems, Inc.".
Implementation-Title: "Java.util" 
Implementation-Version: "build57"
Implementation-Vendor: "Sun Microsystems, Inc."
81
Frank

Manifest.MF contient des informations sur les fichiers contenus dans le fichier JAR.

Chaque fois qu'un fichier JAR est créé, un fichier manifest.mf par défaut est créé dans le dossier META-INF. Il contient les entrées par défaut telles que:

Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)

Ce sont des entrées sous forme de paires "en-tête: valeur". Le premier spécifie la version du manifeste et le second spécifie la version du JDK avec laquelle le fichier JAR est créé.

En-tête Main-Class: Lorsqu'un fichier JAR est utilisé pour regrouper une application dans un package, nous devons spécifier la classe servant un point d'entrée de l'application. . Nous fournissons ces informations en utilisant l’en-tête ‘Main-Class’ du fichier manifeste,

Classe principale: {nom de classe complet}

La valeur ‘Main-Class’ est la classe ayant la méthode main. Après avoir spécifié cette entrée, nous pouvons exécuter le fichier JAR pour exécuter l’application.

En-tête du chemin de classe: La plupart du temps, nous avons besoin d’accéder aux autres fichiers JAR à partir des classes incluses dans le fichier JAR de l’application. Cela peut être fait en fournissant leurs chemins pleinement qualifiés dans le fichier manifeste en utilisant l’en-tête ‘Class-Path’,

Chemin de la classe: {nom-jar1-nom-jar2 nom-répertoire/nom-jar3}

Cet en-tête peut être utilisé pour spécifier les fichiers JAR externes sur le même réseau local et non à l'intérieur du fichier JAR actuel.

En-têtes associés à la version du package: Lorsque le fichier JAR est utilisé pour la gestion des versions de package, les en-têtes suivants sont utilisés comme spécifié par Java = spécification de langue:

Headers in a manifest
Header                  | Definition
-------------------------------------------------------------------
Name                    | The name of the specification.
Specification-Title     | The title of the specification.
Specification-Version   | The version of the specification.
Specification-Vendor    | The vendor of the specification.
Implementation-Title    | The title of the implementation.
Implementation-Version  | The build number of the implementation.
Implementation-Vendor   | The vendor of the implementation.

En-têtes associés au scellement de l'emballage:

Nous pouvons également spécifier si des packages particuliers d'un fichier JAR doivent être scellés, ce qui signifie que toutes les classes définies dans ce package doivent être archivées dans le même fichier JAR. Ceci peut être spécifié à l’aide de l’en-tête ‘Sealed’,

Nom: {package/some-package /} Sealed: true

Ici, le nom du paquet doit se terminer par ‘/’.

Renforcement de la sécurité avec les fichiers de manifeste:

Nous pouvons utiliser des entrées de fichiers manifestes pour assurer la sécurité de l’application Web ou des applets qu’elle contient avec des attributs différents tels que ‘Autorisations’, ‘Codebae’, ‘Nom d’application’, ‘Trusted-Only’ et bien d’autres.

Dossier META-INF:

Ce dossier est l'endroit où réside le fichier manifeste. En outre, il peut contenir plus de fichiers contenant des métadonnées sur l'application. Par exemple, dans un fichier JAR de module EJB, ce dossier contient le descripteur de déploiement EJB du module EJB ainsi que le fichier manifeste du fichier JAR. En outre, il contient le fichier XML contenant le mappage d'une référence EJB abstraite à des ressources de conteneur concrètes du serveur d'applications sur lequel il sera exécuté.

Référence:
https://docs.Oracle.com/javase/tutorial/deployment/jar/manifestindex.html

17
jordom