Abrir archivos JAR con doble clic en Windows 10

Crear archivos JAR desde línea de comandos. Archivos JAR ejecutables y no ejecutables. Ejecutar un archivo JAR desde línea de comandos. Configurar la asociación del tipo de archivo JAR para que se ejecute correctamente con doble clic en Windows. Acceder a imágenes y otros recursos almacenados en un archivo JAR

Comprimir y empaquetar ficheros en un archivo JAR no ejecutable

Comprimir y empaquetar ficheros en un archivo JAR:

jar -cf archivo.jar archivo1 archivo2 archivo3
  • jar: comando para ejecutar la utilidad jar
  • c: crea un archivo nuevo
  • f: especifica el nombre del archivo
  • v: da información detallada (opcional).

Otras opciones:

  • u: actualiza un archivo existente
  • t: lista el contenido de un archivo.

Comprimir y empaquetar ficheros en un archivo JAR ejecutable

Los archivos JAR ejecutables contienen un manifiesto con información necesaria para la máquina virtual; contiene el nombre de la clase que se ejecutará al arrancar el archivo JAR. Para proporcionar esta información se crea un archivo de texto (llamado, por ejemplo, manifiesto.txt) con 2 líneas:

  • una primera línea con el texto (sin comillas) «Main-Class: clase_principal» (clase_principal es el nombre de la clase principal sin extensión class)
  • una segunda línea en blanco (¡sin ella no funciona!).

Una vez creado, el archivo JAR se genera con:

jar -cmf manifiesto.txt archivo.jar *.class

El modificador m incluye información del manifiesto desde el archivo especificado, es importante el orden de m y f porque el nombre del manifiesto y del archivo JAR deben ir en ese mismo orden.
Si hay otros recursos necesarios para ejecutar el archivo JAR en otra máquina o servidor hay que empaquetar esos archivos también. Por ejemplo, si existe una carpeta code con un archivo Code.html y otra carpeta img con 2 imágenes 1.jpg y 2.jpg el comando completo sería

jar -cmf manifiesto.txt archivo.jar *.class code/Code.html img/*.jpg 

Ejecutar un archivo JAR desde línea de comandos

La orden simple para ejecutar un archivo JAR que no tiene dependencias fuera del propio JAR (librerías, imágenes, otros archivos JAR, etc.) es esta:

java -jar archivo.jar

Pero si al ejecutar el JAR desde consola queremos añadir alguna dependencia hay que modificar el comando. Por ejemplo, tenemos un archivo JAR que se desea ejecutar en la ruta C:/Users/user/Documents/Java/carpeta.

Pero en esa carpeta hay otra carpeta lib en la que residen 3 archivos JAR (archivo1.jar, archivo2.jar y archivo3.jar) que son necesarios para que la aplicación Java_app funcione correctamente. En este caso la orden en consola es diferente.

Windows:

java -cp C:/Users/user/Documents/Java/carpeta;C:/Users/user/Documents/Java/carpeta/lib/archivo1.jar;C:/Users/user/Documents/Java/carpeta/lib/archivo2.jar;C:/Users/user/Documents/Java/carpeta/lib/archivo3.jar Java_app

Reemplaza las rutas por las tuyas y observa el separador de rutas ;. Al final va el nombre de la clase principal sin extensión.

Mac:

java -cp .:./lib/archivo1.jar:./lib/archivo2.jar:./lib/archivo3.jar Java_app

Aquí la escritura de la ruta es más cómoda porque el punto refiere al directorio actual. Observa que el separador de rutas es : en lugar de ;.

Ejecutar un archivo JAR con doble clic

En Mac no suele haber problemas y la apertura de estos archivos con doble clic funciona bien sin tener que configurar nada especial pero en Windows es frecuente que haya problemas. Si buscas por Internet verás muchas páginas sobre ello y bastantes soluciones propuestas aunque no todas funcionan.
En muchas ocasiones, incluso con las variables de entorno para Java bien configuradas, los archivos JAR se ejecutan bien desde línea de comandos pero no al hacer doble clic en ellos. Esto casi siempre se debe a una asociación defectuosa del tipo de archivo JAR en el registro de Windows.

Johann N. Löfflmann tiene una utilidad llamada Jarfix que realiza la tarea de forma transparente y casi siempre lo hace correctamente. Está hecha en Java como es lógico y, aunque el autor no ofrece el código fuente, es freeware y parece ser una solución excelente para este problema. El sitio oficial de descarga es la web del autor, allí tiene la versión más reciente. Recomendable.

Leer una imagen empaquetada en el archivo JAR

Para leer una imagen gif o jpg empaquetada en un archivo jar se puede usar este código:

/* para poder usar la clase URL hay que importar el paquete java.net.URL */
URL url = this.getClass().getResource( "/carpeta/archivo.jpg" ); 

Una vez obtenida la URL, se accede a la imagen de varias maneras:

//1
Image imagen = component.getToolKit()getImage(url); 
//2
Image imagen = Toolkit.getDefaultToolKit()getImage(url);
//3
JLabel label = new JLabel();
label.setIcon (new ImageIcon ( url )); 

Dependiendo del sitio en que getResource encuentra la imagen, la cadena devuelta URL presenta diferentes aspectos:

//imagen en un archivo jar del disco local 
jar:file:C:/ruta_ absoluta_al_archivo.jar!/imagen.jpg

//imagen en un archivo jar del servidor web 
jar:http://www.dominio.com/archivo.jar!/imagen.jpg

//imagen alojada en el disco local
file:C:/ruta_absoluta_a_imagen.jpg

//imagen alojada en el servidor 
http://www.dominio.com/ruta_relativa_a_imagen.jpg