Un archivo JAR ("archivo Java") es un formato de archivo de paquete que normalmente se utiliza para agregar muchos archivos de clase Java y metadatos y recursos asociados (texto, imágenes, etc.) en un solo archivo para su distribución. [4]
Los archivos JAR son archivos de almacenamiento que incluyen un archivo de manifiesto específico de Java . Están construidos en formato ZIP y normalmente tienen una .jar
extensión de archivo . [5]
Un archivo JAR permite que los tiempos de ejecución de Java implementen de manera eficiente una aplicación completa, incluidas sus clases y sus recursos asociados, en una sola solicitud. Los elementos del archivo JAR pueden comprimirse, lo que acorta los tiempos de descarga.
Un archivo JAR puede contener un archivo de manifiesto, que se encuentra en META-INF/MANIFEST.MF
. Las entradas del archivo de manifiesto describen cómo utilizar el archivo JAR. Por ejemplo, se puede utilizar una entrada Classpath para especificar otros archivos JAR para cargar con el JAR.
El contenido de un archivo se puede extraer utilizando cualquier software de extracción de archivos que admita el formato ZIP o la jar
utilidad de línea de comandos proporcionada por el kit de desarrollo de Java.
Los desarrolladores pueden firmar digitalmente archivos JAR. En ese caso, la información de la firma pasa a formar parte del archivo de manifiesto incrustado. El JAR en sí no está firmado, sino que cada archivo dentro del archivo aparece junto con su suma de verificación; son estas sumas de verificación las que están firmadas. Varias entidades pueden firmar el archivo JAR, cambiando el archivo JAR con cada firma, aunque los archivos firmados siguen siendo válidos. Cuando el tiempo de ejecución de Java carga archivos JAR firmados, puede validar las firmas y negarse a cargar clases que no coincidan con la firma. También puede admitir paquetes 'sellados', en los que el cargador de clases sólo permitirá cargar clases Java en el mismo paquete si todas están firmadas por las mismas entidades. Esto evita que se inserte código malicioso en un paquete existente y, por lo tanto, obtenga acceso a clases y datos dentro del alcance del paquete.
El contenido de los archivos JAR puede ofuscarse para dificultar la ingeniería inversa .
Un programa Java ejecutable se puede empaquetar en un archivo JAR, junto con cualquier biblioteca que utilice el programa. Los archivos JAR ejecutables tienen el manifiesto que especifica la clase de punto de entradaMain-Class: myPrograms.MyClass
con una ruta de clase explícita (y el argumento -cp se ignora). Algunos sistemas operativos pueden ejecutarlos directamente al hacer clic en ellos. La invocación típica es java -jar foo.jar
desde una línea de comando.
Se pueden crear lanzadores nativos en la mayoría de las plataformas. Por ejemplo, los usuarios de Microsoft Windows que prefieren tener archivos EXE de Windows pueden usar herramientas como JSmooth, Launch4J, WinRun4J o Nullsoft Scriptable Install System para empaquetar archivos JAR individuales en archivos ejecutables.
Un archivo de manifiesto es un archivo de metadatos contenido dentro de un JAR. [6] [7] Define datos relacionados con la extensión y el paquete. Contiene pares nombre-valor organizados en secciones. Si se pretende utilizar un archivo JAR como archivo ejecutable, el archivo de manifiesto especifica la clase principal de la aplicación. El archivo de manifiesto se llama MANIFEST.MF
. El directorio de manifiesto debe ser la primera entrada del archivo comprimido.
El manifiesto aparece en la ubicación canónicaMETA-INF/MANIFEST.MF
. [8] Solo puede haber un archivo de manifiesto en un archivo y debe estar en esa ubicación.
El contenido del archivo de manifiesto en un archivo JAR creado con la versión 1.0 del Java Development Kit es el siguiente.
Versión del manifiesto: 1.0
El nombre 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 puede contener información sobre los otros archivos empaquetados en el archivo. El contenido del manifiesto depende 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. Debe estar codificado en UTF-8.
Los archivos JAR creados únicamente con el fin de archivarlos no utilizan el MANIFEST.MF
archivo.
La mayoría de los usos de los archivos JAR van más allá del simple archivado y compresión y requieren información especial en el archivo de manifiesto.
El manifiesto permite a los desarrolladores definir varias características útiles para sus archivos jar. Las propiedades se especifican en pares clave-valor.
Si una aplicación está contenida en un archivo JAR, la máquina virtual Java necesita conocer el punto de entrada de la aplicación. Un punto de entrada es cualquier clase con un public static void main(String[] args)
método. Esta información se proporciona en el encabezado del manifiesto Main-Class, que tiene la forma general:
Clase principal: com.ejemplo.MyClassName
En este ejemplo com.example.MyClassName.main()
se ejecuta al iniciar la aplicación.
Opcionalmente, se puede sellar un paquete dentro de un archivo JAR, lo que significa que todas las clases definidas en ese paquete se archivan en el mismo archivo JAR. Se puede sellar un paquete para garantizar la coherencia de las versiones entre las clases del software o como medida de seguridad.
Para sellar un paquete, debe aparecer una entrada de Nombre, seguida de un encabezado Sellado, como por ejemplo:
Nombre : miEmpresa/miPaquete/ Sellado : verdadero
El valor del encabezado Nombre es la ruta relativa del paquete. Tenga en cuenta que termina con '/' para distinguirlo de un nombre de archivo. Cualquier encabezado que siga a un encabezado de Nombre, sin líneas en blanco intermedias, se aplica al archivo o paquete especificado en el encabezado de Nombre. En el ejemplo anterior, debido a que el Sealed
encabezado aparece después del Name: myCompany/myPackage
encabezado sin líneas en blanco intermedias, el Sealed
encabezado se aplica (solo) al paquete myCompany/myPackage
.
La característica de paquetes sellados ha quedado obsoleta gracias al Java Platform Module System introducido en Java 9, en el que los módulos no pueden dividir paquetes. [9]
Varios encabezados de manifiesto contienen información sobre versiones. Se puede asignar un conjunto de encabezados a cada paquete. Los encabezados de versiones aparecen directamente debajo del encabezado Nombre del paquete. Este ejemplo muestra todos los encabezados de versiones:
Nombre : java/util/ Título de especificación : "Clases de utilidades Java" Versión de especificación : "1.2" Proveedor de especificación : "Sun Microsystems, Inc." Título de implementación : "java.util" Versión de implementación : "build57" Proveedor de implementación : "Sun Microsystems, Inc."
Opcionalmente, un frasco se puede marcar como frasco de liberación múltiple. El uso de la función de versiones múltiples permite a los desarrolladores de bibliotecas cargar código diferente según la versión del tiempo de ejecución de Java. [10] Esto, a su vez, permite a los desarrolladores aprovechar nuevas funciones sin sacrificar la compatibilidad.
Se habilita un jar de versiones múltiples mediante la siguiente declaración en el manifiesto:
Lanzamiento múltiple : verdadero
El MANIFEST.MF
archivo se puede utilizar para especificar todas las clases que deben cargarse para que una aplicación pueda ejecutarse. [11]
Tenga en cuenta que las entradas de Class-Path están delimitadas con espacios, no con el delimitador de ruta del sistema:
Ruta de clase : . pkg1.jar ruta/a/pkg2.jar
La herramienta de compilación Apache Ant tiene su propio paquete para leer y escribir archivos Zip y JAR, incluida la compatibilidad con extensiones del sistema de archivos Unix . El paquete org.apache.tools.zip se publica bajo la licencia Apache Software Foundation y está diseñado para poder utilizarse fuera de Ant.
Varios formatos de archivos relacionados se basan en el formato JAR:
service.xml
archivo y los archivos JAR que lo acompañan.