Noté que los archivos JAR, WAR y EAR tienen un MANIFEST.MF
archivo debajo de la META-INF
carpeta.
¿Cuál es el uso del MANIFEST.MF
archivo? ¿Qué todas las cosas se pueden especificar en este archivo?
Noté que los archivos JAR, WAR y EAR tienen un MANIFEST.MF
archivo debajo de la META-INF
carpeta.
¿Cuál es el uso del MANIFEST.MF
archivo? ¿Qué todas las cosas se pueden especificar en este archivo?
Respuestas:
El contenido del archivo de manifiesto en un archivo JAR creado con la versión 1.0 del Java Development Kit es el siguiente.
Manifest-Version: 1.0
Todas las entradas son pares de nombre-valor. El nombre de un encabezado está separado de su valor por dos puntos. El manifiesto predeterminado muestra que se ajusta a la versión 1.0 de la especificación del manifiesto. El manifiesto también puede contener información sobre los otros archivos empaquetados en el archivo. Exactamente qué información de archivo se registra en el manifiesto dependerá del uso previsto para el archivo JAR. El archivo de manifiesto predeterminado no hace suposiciones sobre qué información debe registrar sobre otros archivos, por lo que su única línea contiene datos solo sobre sí mismo. Encabezados de manifiesto de propósito especial
Dependiendo de la función prevista del archivo JAR, es posible que sea necesario modificar el manifiesto predeterminado. Si el archivo JAR se crea solo con el propósito de archivarlo, entonces el archivo MANIFEST.MF no tiene ningún propósito. La mayoría de los usos de los archivos JAR van más allá del simple archivado y la compresión y requieren información especial en el archivo de manifiesto. A continuación se resumen breves descripciones de los encabezados que se requieren para algunas funciones de archivos JAR de propósito especial
Aplicaciones empaquetadas como archivos JAR: si una aplicación está empaquetada en un archivo JAR, es necesario indicar a la máquina virtual Java cuál es el punto de entrada a la aplicación. Un punto de entrada es cualquier clase con un método principal vacío estático público (String [] args). Esta información se proporciona en el encabezado Main-Class, que tiene la forma general:
Main-Class: classname
El valor classname debe reemplazarse con el punto de entrada de la aplicación.
Extensiones de descarga: las extensiones de descarga son archivos JAR a los que se hace referencia en los archivos de manifiesto de otros archivos JAR. En una situación típica, un subprograma se incluirá en un archivo JAR cuyo manifiesto hace referencia a un archivo JAR (o varios archivos JAR) que servirá como una extensión para los propósitos de ese subprograma. Las extensiones pueden hacer referencia entre sí de la misma manera. Las extensiones de descarga se especifican en el campo del encabezado Class-Path en el archivo de manifiesto de un subprograma, aplicación u otra extensión. Un encabezado Class-Path podría verse así, por ejemplo:
Class-Path: servlet.jar infobus.jar acme/beans.jar
Con este encabezado, las clases en los archivos servlet.jar, infobus.jar y acme / beans.jar servirán como extensiones para propósitos del applet o aplicación. Las URL en el encabezado Class-Path se proporcionan en relación con la URL del archivo JAR del subprograma o aplicación.
Sellado de paquetes: un paquete dentro de un archivo JAR se puede sellar opcionalmente, lo que significa que todas las clases definidas en ese paquete deben archivarse en el mismo archivo JAR. Un paquete puede estar sellado para garantizar la coherencia de la versión entre las clases de su software o como medida de seguridad. Para sellar un paquete, se debe agregar un encabezado de Nombre para el paquete, seguido de un encabezado Sellado, similar a este:
Name: myCompany/myPackage/
Sealed: true
El valor del encabezado Name es la ruta relativa del paquete. Tenga en cuenta que termina con una '/' para distinguirlo de un nombre de archivo. Los encabezados que siguen a un encabezado de Nombre, sin líneas en blanco intermedias, se aplican al archivo o paquete especificado en el encabezado de Nombre. En el ejemplo anterior, debido a que el encabezado Sealed aparece después del encabezado Name: myCompany / myPackage, sin líneas en blanco entre ellos, el encabezado Sealed se interpretará como que se aplica (solo) al paquete myCompany / myPackage.
Control de versiones de paquetes: la especificación de control de versiones de paquetes define varios encabezados de manifiesto para contener información de versiones. Se puede asignar un conjunto de estos encabezados a cada paquete. Los encabezados de control de versiones deben aparecer directamente debajo del encabezado Nombre del paquete. Este ejemplo muestra todos los encabezados de control de versiones:
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."
Manifest.MF contiene información sobre los archivos contenidos en el archivo JAR.
Siempre que se crea un archivo JAR, se crea un archivo manifest.mf predeterminado dentro de la carpeta META-INF y contiene las entradas predeterminadas como esta:
Manifest-Version: 1.0
Created-By: 1.7.0_06 (Oracle Corporation)
Estas son entradas como pares "encabezado: valor". El primero especifica la versión del manifiesto y el segundo especifica la versión JDK con la que se crea el archivo JAR.
Encabezado de clase principal: cuando se usa un archivo JAR para empaquetar una aplicación en un paquete, necesitamos especificar la clase que sirve como punto de entrada de la aplicación. Proporcionamos esta información utilizando el encabezado 'Main-Class' del archivo de manifiesto,
Clase principal: {nombre de clase totalmente calificado}
El valor de 'Main-Class' aquí es la clase que tiene el método principal. Luego de especificar esta entrada podemos ejecutar el archivo JAR para ejecutar la aplicación.
Encabezado Class-Path: la mayoría de las veces necesitamos acceder a los otros archivos JAR de las clases empaquetadas dentro del archivo JAR de la aplicación. Esto se puede hacer proporcionando sus rutas completamente calificadas en el archivo de manifiesto usando el encabezado 'Class-Path',
Class-Path: {nombre-jar1-nombre-jar2-nombre-directorio / nombre-jar3}
Este encabezado se puede utilizar para especificar los archivos JAR externos en la misma red local y no dentro del JAR actual.
Encabezados relacionados con la versión del paquete: cuando se utiliza el archivo JAR para el control de versiones del paquete, se utilizan los siguientes encabezados según lo especificado por la especificación del lenguaje Java:
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.
Encabezados relacionados con el sellado de paquetes:
También podemos especificar si algún paquete particular dentro de un archivo JAR debe ser sellado, lo que significa que todas las clases definidas en ese paquete deben archivarse en el mismo archivo JAR. Esto se puede especificar con la ayuda del encabezado 'Sellado',
Nombre: {paquete / algún-paquete /} Sellado: verdadero
Aquí, el nombre del paquete debe terminar con '/'.
Mejora de la seguridad con archivos de manifiesto:
Podemos usar entradas de archivos de manifiesto para garantizar la seguridad de la aplicación web o los paquetes de subprogramas con los diferentes atributos como 'Permisos', 'Codebae', 'Nombre de la aplicación', 'Solo de confianza' y muchos más.
Carpeta META-INF:
Esta carpeta es donde reside el archivo de manifiesto. Además, puede contener más archivos que contengan metadatos sobre la aplicación. Por ejemplo, en un archivo JAR de módulo EJB, esta carpeta contiene el descriptor de implementación EJB para el módulo EJB junto con el archivo de manifiesto para el JAR. Además, contiene el archivo xml que contiene el mapeo de referencias EJB abstractas a recursos de contenedores concretos del servidor de aplicaciones en el que se ejecutará.
Referencia:
https://docs.oracle.com/javase/tutorial/deployment/jar/manifestindex.html