Consejo 120 de Java: Ejecute archivos JAR autoextraíbles

Durante muchos años, la creación de archivos zip de Phil Katz ha sido uno de los formatos de archivo más populares. Sun ha adoptado el formato zip como base para Java Archive (JAR). Sun ha ampliado el uso del formato zip con varias convenciones para que pueda empaquetar clases de Java en un archivo de almacenamiento. Con la adición del archivo de manifiesto JAR , el tiempo de ejecución de Java puede localizar fácilmente y ejecutar directamente la clase principal de la aplicación Java contenida en el archivo jar.

Algunas zipherramientas de utilidad pueden crear archivos autoextraíbles para varias plataformas, como MS Windows. La herramienta de utilidad combina un archivo zip normal con un programa extractor para generar un nuevo archivo ejecutable (exe). Los receptores del archivo exe solo necesitan ejecutarlo para extraer el contenido del archivo zip original. El ejecutable ejecuta el programa de extracción para extraer los archivos archivados en un directorio de salida especificado por el usuario.

Puede convertir un archivo zip o jar base en un archivo jar ejecutable en cualquier plataforma Java. Mientras que el zip autoextraíble solo puede crear ejecutables específicos de la plataforma, el archivo jar autoextraíble se puede distribuir y ejecutar en cualquier plataforma compatible con Java.

Crear el archivo jar autoextraíble es sencillo. Solo necesita un archivo de manifiesto JAR especial, un programa de extracción basado en Java, el archivo zip o jar que contiene los archivos de contenido base y cualquier jaraplicación de utilidad del SDK de Java .

El archivo de manifiesto

Para crear archivos JAR ejecutables, primero necesita un archivo de manifiesto llamado MANIFEST.MFen el META-INFdirectorio. El archivo de manifiesto puede contener varias entradas posibles; sin embargo, para nuestros propósitos aquí, solo necesitamos especificar el nombre de la clase Java que contiene el main()método del programa extractor basado en Java :

Clase principal: ZipSelfExtractor 

Hemos agregado un archivo de manifiesto llamado jarmanifestal código de ejemplo de este consejo. Para obtener más información sobre el archivo de manifiesto, consulte la Especificación del archivo Jar.

El extractor

Puede hacer el programa de extracción utilizando varios enfoques. El enfoque que presentamos aquí es simple y directo. Primero, el programa de extracción descubre el nombre del archivo jar autoextraíble. Con ese nombre en la mano, el extractor utiliza las bibliotecas estándar de Java zip / jar integradas para extraer los archivos de contenido del archivo. Puede encontrar el código fuente completo ZipSelfExtractoren ZipSelfExtractor.java.

Obtener el nombre del archivo jar en el programa de extracción puede ser complicado. Aunque el nombre del archivo jar aparece en la línea de comando, ese nombre no se pasa al main()método de la clase . Por tanto, en el programa extractor utilizamos el siguiente código para extraer la información de la URL que apunta al extractor:

private String getJarFileName () {myClassName = this.getClass (). getName () + ".class"; URL urlJar = this.getClass (). GetClassLoader (). GetSystemResource (myClassName); String urlStr = urlJar.toString (); int from = "jar: file:". length (); int to = urlStr.indexOf ("! /"); return urlStr.substring (desde, hasta); }

Observe que en el getSystemResource()método pasamos en myClassNamelugar de ZipSelfExtractor.class. Eso nos permite cambiar el nombre del programa extractor sin cambiar esa parte del código. Lo configuramos myClassNamebuscando el nombre de la clase actual.

A continuación, extraemos el nombre del archivo jar. Primero, pedimos una URL al archivo de clase que contiene la clase que se está ejecutando actualmente (que es el programa extractor). Una vez que tenemos la URL, podemos recortar el nombre del archivo jar. Por definición, la URL del programa de extracción JAR sigue el formato básico:

  1. jar:, que muestra que el ejecutable se ejecuta desde dentro de un archivo jar
  2. La URL del archivo jar, por ejemplo file:/C:/temp/test.jar, seguida del !carácter
  3. El nombre de la ruta interna del archivo dentro del JAR, como /ZipSelfExtractor.class

En el caso del programa de extracción, la URL podría verse así:

jar: archivo: /home/johnm/test/zipper.jar! /ZipSelfExtractor.class 

Ahora que tenemos el nombre del archivo jar, podemos realizar la extracción. Las entrañas del programa de extracción se basan en las bibliotecas de manipulación de archivos zip / jar de Java integradas para descomprimir los archivos de contenido contenidos en el archivo. Consulte Recursos para obtener más información sobre las bibliotecas de manipulación de archivos zip / jar.

Para facilitar su uso, el extractor es una aplicación gráfica de Java. La aplicación usa la JFileChooserclase para permitir que los usuarios especifiquen el directorio de destino en el que quieren que se extraigan los archivos. A ProgressMonitormuestra el progreso del proceso de extracción. Si un archivo puede sobrescribir un archivo ya existente, se le pregunta al usuario si desea sobrescribir el archivo existente. Al final, un cuadro de diálogo estándar presenta estadísticas de extracción.

Finalmente, el programa extractor comprueba que no extrae los archivos que hacen que el archivo jar sea autoextraíble: el archivo de manifiesto y el archivo del extractor .class; el programa debería simplemente extraer el contenido JAR original. Esos dos archivos son artefactos del archivo jar autoextraíble y no forman parte de los archivos de contenido base originales.

Empacando el archivo jar

Ahora que tenemos el archivo de manifiesto y el programa extractor, podemos construir el archivo jar autoextraíble. Podemos usar manualmente la utilidad del JDK jarpara hacer un archivo jar autoextraíble. Por ejemplo, asumiendo que tiene un archivo zip llamado myzip.zip, puede realizar los siguientes pasos para crear un archivo autoextraíble de él:

  1. cd al directorio que contiene myzip.zip
  2. Descargar zipper.jar
  3. Extrae los archivos en el directorio actual. Lo hemos convertido en un JAR autoextraíble:
    java -jar zipper.jar 
  4. Copie el zipper.classarchivo aZipSelfExtractor.class
  5. Cambiar nombre myzip.zipcomomyzip.jar
  6. Actualice myzip.jarcon los archivos jarmanifesty ZipSelfExtractor.class:
    jar uvfm myzip.jar jarmanifest ZipSelfExtractor.class 

Ahora myzip.jares autoextraíble en todas las plataformas que contienen Java Runtime Environment (JRE) 1.2 o posterior. Para ejecutar el archivo jar autoextraíble, ejecute:

java -jar myzip.jar 

Tenga en cuenta que algunas plataformas pueden tener enlaces ya configurados para que pueda ejecutar el archivo jar simplemente haciendo clic en el myzip.jaricono del archivo, que ejecutará el equivalente en la línea de comandos.

Ejercicio para el lector

La corriente ZipSelfExtractno se integra bien si crea un JAR autoextraíble a partir de un archivo jar existente que contiene un archivo de manifiesto. Agregue inteligencia al autoextractor y las instrucciones de creación para que pueda manejar archivos jar existentes que contienen archivos de manifiesto.

Libera tu mano del JAR

Un archivo jar autoextraíble es un buen mecanismo para la distribución de archivos multiplataforma. Los JAR autoextraíbles son fáciles de crear, y el requisito mínimo de usuario de una instalación JRE 1.2 o posterior es una compensación razonable para obtener soporte multiplataforma.

En lugar de crear manualmente el archivo jar autoextraíble, consulte ZipAnywhere. ZipAnywhere es una completa herramienta zip/ jarherramienta de utilidad escrita en Java puro 100%. Es una herramienta gratuita basada en GUI a la WinZip y puede crear archivos jar autoextraíbles con el clic de un botón.

El Dr. Zunhe Steve Jin es ingeniero de software de planta en Rational Software y autor de ZipAnywhere. John D. Mitchell es el editor colaborador de la columna Consejos y trucos de JavaWorld. John es también el fundador y arquitecto jefe de Non, Inc., una práctica de consultoría en Gestión de Riesgos Empresariales Tecnológicos.

Más información sobre este tema

  • Descargue los archivos fuente para este consejo

    //www.javaworld.com/javaworld/javatips/javatip120/zipper.jar

  • "Java Tip 49How to Extract Java Resources from JAR and Zip Archives," John D. Mitchell and Arthur Choi (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip49.html

  • "Java Tip 70Create Objects from Jar Files!" John D. Mitchell (JavaWorld)

    //www.javaworld.com/javaworld/javatips/jw-javatip70.html

  • Jar File Specification

    //java.sun.com/j2se/1.3/docs/guide/jar/jar.html

  • JAR command line guide

    //java.sun.com/j2se/1.3/docs/tooldocs/win32/jar.html

  • ZipAnywhere, GUI-based self-extracting JAR creation tool

    //www.geocities.com/zipanywhere

  • View all previous Java Tips and submit your own

    //www.javaworld.com/javatips/jw-javatips.index.html

  • Learn Java from the ground up in JavaWorld's Java 101 column

    //www.javaworld.com/javaworld/topicalindex/jw-ti-java101.html

  • Java experts answer your toughest Java questions in JavaWorld's Java Q&A column

    //www.javaworld.com/javaworld/javaqa/javaqa-index.html

  • Browse articles by topic in JavaWorld's Topical Index

    //www.javaworld.com/channel_content/jw-topical-index.shtml

  • Speak out in our Java Forum

    //forums.idg.net/[email protected]@.ee6b802

  • Sign up for JavaWorld's free weekly email newsletters

    //www.idg.net/jw-subscribe

  • You'll find a wealth of IT-related articles from our sister publications at .net

Esta historia, "Java Tip 120: Ejecute JAR autoextraíbles" fue publicada originalmente por JavaWorld.