Un JAR ( J ava AR chive) es un formato de archivo de paquete que se utiliza normalmente para agregar muchos archivos de clase Java y metadatos y recursos asociados (texto, imágenes, etc.) en un archivo para su distribución. [3]
Extensión de nombre de archivo | .frasco |
---|---|
Tipo de medio de Internet | |
Identificador de tipo uniforme (UTI) | com.sun.java-archive |
número mágico | 50 4b 03 04 ASCII: PK \ x03 \ x04 |
Desarrollado por | Netscape , Sun Microsystems , Oracle Corporation |
Tipo de formato | Archivo de archivos , compresión de datos |
Extendido desde | CÓDIGO POSTAL |
Los archivos JAR son archivos de almacenamiento que incluyen un archivo de manifiesto específico de Java . Se basan en el formato ZIP y normalmente tienen una .jar
extensión de archivo . [4]
Diseño
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, una entrada Classpath se puede utilizar para especificar otros archivos JAR para cargar con el JAR.
Extracción
El contenido de un archivo se puede extraer utilizando cualquier software de compresión estándar o la jar
utilidad de línea de comandos: " -xf foo.
".
Seguridad
Los desarrolladores pueden firmar digitalmente archivos JAR. En ese caso, la información de la firma se convierte en parte del archivo de manifiesto incrustado. El JAR en sí no está firmado, sino que todos los archivos dentro del archivo se enumeran junto con su suma de comprobación; son estas sumas de comprobació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 Classloader solo permitirá que las clases de Java se carguen en el mismo paquete si todas están firmadas por las mismas entidades. Esto evita que se inserte código malintencionado en un paquete existente, y así obtener acceso a clases y datos dentro del alcance del paquete.
El contenido de los archivos JAR puede estar oculto para dificultar la ingeniería inversa .
Archivos JAR ejecutables
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 entrada con Main-Class: myPrograms.MyClass
una ruta de clase explícita (y el argumento -cp se ignora). Algunos sistemas operativos pueden ejecutarlos directamente cuando se hace clic en ellos. La invocación típica es java -jar foo.jar
desde una línea de comando.
Los lanzadores nativos se pueden crear 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 ejecutables.
Manifiesto
Un archivo de manifiesto es un archivo de metadatos contenido en un JAR. [5] [6] Define la extensión y los datos relacionados con el paquete. Contiene pares de nombre-valor organizados en secciones. Si un archivo JAR está destinado a utilizarse 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.
Especificaciones
El manifiesto aparece en la ubicación canónicaMETA-INF/MANIFEST.MF
. [7] 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 de 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.
Encabezados de manifiesto de propósito especial
Los archivos JAR creados solo con el propósito de archivar no usan 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.
Características
El manifiesto permite a los desarrolladores definir varias funciones útiles para sus jar. Las propiedades se especifican en pares clave-valor.
Aplicaciones
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 Main-Class del manifiesto, que tiene la forma general:
Clase principal: com.example.MyClassName
En este ejemplo, se com.example.MyClassName.main()
ejecuta al iniciar la aplicación.
Sellado de paquetes
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. Un paquete puede estar sellado para garantizar la coherencia de la versión 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:
Nombre : 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 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 los paquetes sellados está anticuada por el sistema de módulos de plataforma Java introducido en Java 9, en el que los módulos no pueden dividir los paquetes. [8]
Control de versiones del paquete
Varios encabezados de manifiesto contienen información sobre versiones. Se puede asignar un conjunto de encabezados a cada paquete. Los encabezados de control de versiones aparecen directamente debajo del encabezado Nombre del paquete. Este ejemplo muestra todos los encabezados de control de versiones:
Nombre : java / util / Título de la especificación : "Clases de utilidades Java" Versión de la especificación : "1.2" Proveedor de la 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."
Lanzamiento múltiple
Un frasco se puede marcar opcionalmente como un frasco de liberación múltiple. El uso de la función de múltiples versiones permite a los desarrolladores de bibliotecas cargar código diferente según la versión del tiempo de ejecución de Java. [9] Esto, a su vez, permite a los desarrolladores aprovechar las nuevas funciones sin sacrificar la compatibilidad.
Un jar de múltiples versiones se habilita mediante la siguiente declaración en el manifiesto:
Lanzamiento múltiple : verdadero
Dependencias
El MANIFEST.MF
archivo se puede utilizar para especificar todas las clases que se deben cargar para que una aplicación pueda ejecutarse. [10]
Tenga en cuenta que las entradas de Class-Path están delimitadas con espacios, no con el delimitador de ruta del sistema:
Class-Path : . pkg1.jar ruta / a / pkg2.jar
Soporte Apache Ant Zip / JAR
La herramienta de compilación Apache Ant tiene su propio paquete para leer y escribir archivos Zip y JAR, incluido el soporte para 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 ser utilizado fuera de Ant.
Formatos relacionados
Varios formatos de archivo relacionados se basan en el formato JAR:
- Los archivos WAR (archivo de aplicaciones web), también archivos Java, almacenan archivos XML , clases Java, páginas JavaServer y otros objetos para aplicaciones web.
- Archivos RAR (archivo de adaptador de recursos) (no confundir con el formato de archivo RAR ), también archivos Java, almacenar archivos XML, clases Java y otros objetos para aplicaciones J2EE Connector Architecture (JCA).
- Los archivos EAR (archivo empresarial) proporcionan archivos Java compuestos que combinan archivos XML, clases Java y otros objetos, incluidos archivos de archivo Java JAR, WAR y RAR para aplicaciones empresariales.
- SAR (archivo de servicio) es similar a EAR. Proporciona un archivo service.xml y los archivos JAR que lo acompañan.
- APK (paquete de aplicaciones de Android), una variante del formato de archivo de Java, se utiliza para las aplicaciones de Android . [11]
- AAR (archivo de Android) se utiliza para la distribución de bibliotecas de Android , normalmente a través de Maven . [12]
- PAR (archivo de plan): compatible con el servidor de aplicaciones Eclipse Virgo OSGi , permite la implementación de aplicaciones OSGi de varios paquetes como un solo archivo y proporciona aislamiento de otras aplicaciones basadas en PAR implementadas en el mismo servidor.
- KAR (archivo Karaf): compatible con el servidor de aplicaciones Apache Karaf OSGi, permite la implementación de aplicaciones OSGi de múltiples paquetes y múltiples funciones.
Ver también
- JAR infierno
- Sistema de módulos Java
- Convenciones de empaque abiertas
- JAD (formato de archivo)
- Gifar
Referencias
- ^ "Extensión de archivo .JAR Detalles" . Consultado el 29 de noviembre de 2012 .
- ^ "MIME: Glosario de Java" . Consultado el 29 de noviembre de 2012 .
- ^ "API y guías de desarrollo relacionadas con JDK 6 Java Archive (JAR)" .
- ^ "Especificación de archivo JAR" . Documentación de Java SE . Oráculo. Archivado desde el original el 11 de septiembre de 2017.
- ^ "Comprensión del manifiesto" . Java.sun.com. 2003-03-21 . Consultado el 31 de julio de 2012 .
- ^ "Especificación de archivo JAR" . Download.oracle.com . Consultado el 31 de julio de 2012 .
- ^ "Especificación de archivo JAR" . Download.oracle.com . Consultado el 31 de julio de 2012 .
- ^ "JEP 261: Sistema de módulos" . Consultado el 6 de febrero de 2021 .
- ^ "JEP 238: archivos JAR de varias versiones" . Consultado el 6 de febrero de 2021 .
- ^ la especificación del servlet de Sun, página 72 (servlet-2_4-fr-spec.pdf). Consulte también las Notas técnicas de Java .
- ^ "Glosario" . developer.android.com .
- ^ "Biblioteca de Android" . developer.android.com .
enlaces externos
- Descripción general del archivo JAR
- Especificación de archivo JAR