Ficheros jar

De ChuWiki

Los ficheros jar[editar]

Cuando hacemos un programa java, normalmente tenemos varios ficheros java. Al compilarlos, obtenermos varios ficheros .class. Además, si metemos nuestras clases en paquetes (con package), estos .class van distribuidos en una estructura de directorios paralela a la de los paquetes. Por ejemplo, si nuestra clase pertenece a un paquete chuidiang.prueba, entonces el .class estará situado en un subdirectorio prueba que está situado a su vez en un subdirectorio chuidiang.

Si queremos distribuir nuestro programa java, deberíamos distribuir todos los .class, con su estructura de directorios completa. Esto está claro que es un poco pesado.

Java, con su utilidad jar (en JAVA_HOME/bin), nos permite empaquetar todas estas estructuras de directorios y ficheros .class en un único fichero de extensión .jar

Un fichero .jar no es más que un fichero que contiene dentro otros ficheros, similar a los .zip o .rar de winzip o winrar. De esta forma, podemos distribuir nuestro programar en un solo fichero .jar

La forma de crear un fichero .jar desde una ventana de ms-dos o shell de unix es esta

$ jar cf fichero.jar fichero1.class fichero2.class directorio1 directorio2

Esto meterá en fichero.jar todos los .class que le pasemos y los directorios, con su contenido completo.

Si la clase que contiene el main está en chuidiang.prueba.ClasePrincipal, la forma de ejecutar este jar es así

$ java -cp fichero.jar chuidiang.prueba.ClasePrincipal

es decir, indicando en la opción -cp (classpath) el fichero .jar y luego el nombre de la clase que tiene el main.

Si en nuestra aplicación necesitamos adicionalmente otros jar de otras librerías que nos hayamos bajado, NO podemos meterlos dentro de nuestro jar como un fichero más. Debemos distribuir todos los jar por separado (el nuestro y el de las librerías) y a la hora de ejecutar hay que añadirlas al CLASSPATH con la opción -cp

En linux:
$ java -cp fichero.jar:/path/otro.jar chuidiang.prueba.ClasePrincipal
En windows
C:\> java -classpath fichero.jar;C:\path\otro.jar chuidiang.prueba.ClasePrincipal
Fijate que en linux el separador es : y en windows es ;

El fichero de manifiesto[editar]

Para evitar tener que recordar el nombre de la clase con el main, se puede poner en un fichero especial (llamado fichero de manifiesto) y meter este fichero dentro del jar. Para ello, escribimos un fichero de texto con cualquier nombre (por ejemplo, manifiesto.txt) con el siguiente contenido

Main-Class: chuidiang.prueba.ClasePrincipal

A la hora de hacer el jar, lo metemos también

jar cmf manifiesto.txt fichero.jar fichero1.class fichero2.class directorio1 directorio2

La opción m indica que el fichero que va detrás es el de manifiesto y el comando jar lo tratará de forma especial. Si ponemos las opciones como en el ejemplo, es decir, mf, primero se pone el fichero de manifiesto y luego el nombre del fichero jar. Si las ponemos al revés, es decir fm, entonces se pone primero el nombre del fichero jar y luego el de manifiesto. El resto se supone que son ficheros o directorios que se van a meter en el jar.

Una vez hecho esto, se ejecuta así

java -jar fichero.jar

La opción -jar indica que se debe buscar dentro del fichero .jar el fichero de manifiesto y ejecutar la clase que se indica allí.


Ejecutar el jar desde windows[editar]

Podemos configurar windows para que abra los ficheros .jar con el comando javaw. Si instalamos java 5 esto se hace automáticamente. Si no, dando a "mi pc", "herramientas", "opciones de carpeta", "tipos de archivo", buscamos o creamos JAR, "opciones avanzadas", "open", "modificar" y ponemos algo como esto

"C:\Archivos de programa\Java\jre1.5.0_06\bin\javaw.exe" -jar "%1" %*

Con esto, dando doble click sobre un fichero jar que tenga fichero de manifiesto, se ejecutará el programa java.


Depender de otros jar[editar]

A veces nuestro programa depende de otros jar que nos hemos bajado de algún sitio (un driver de base de datos, log4j, etc). Para que todo funcione como debe, en el fichero de manifiesto podemos añadir otra línea más

Main-Class: chuidiang.prueba.ClasePrincipal
Class-Path: otrofichero.jar otrofichero2.jar otrofichero3.jar

Creamos el jar como antes y listo.

Para que esto se ejecute correctamente, todos los jar, el nuestro y los adicionales, deben estar ubicado en el mismo directorio. Ahora ya podemos ejecutar como antes.

Es posible dar a los jar paths relativos a nuestro jar principal. Por ejemplo

Main-Class: chuidiang.prueba.ClasePrincipal
Class-Path: lib/otrofichero.jar lib/otrofichero2.jar lib/otrofichero3.jar

Esto hace que nuestro jar debe estar en un directorio que contenga un subdirectorio lib y dentro de este los otros jar.

+-nuestro.jar
|
+-lib
   |
   +-otrofichero.jar
   +-otrofichero2.jar
   +-otrofichero3.jar

Meter otros ficheros en el jar[editar]

En el jar, además del fichero de manifiesto y los .class, podemos meter cualquier otro tipo de fichero. Por ejemplo, se pueden meter imágenes .gif o fichero de propiedades .properties.

Para que nuestro código java pueda verlos, en vez de abrirlos de forma normal, debemos hacerlo a través del class loader. Para ello, usando una clase que esté dentro del mismo fichero jar que contiene las imagenes o fichero de propieades, hacemos algo como esto (no lo he probado, va de memoria).

ClassLoader classLoader = NombreClase.class.getClassLoader();
URL url= classLoader.getResource ("imagenes/fichero.gif");
ImageIcon imagen = new ImageIcon (url);