Sie sind auf Seite 1von 12

Ficheros JAR

1 Qu son los ficheros JAR? 2 Creacin en un terminal de texto 3 Applets 4 Creando ficheros .jar desde JCreator

1 Qu son los ficheros JAR?


Como hemos visto una aplicacin en Java est compuesta por varios ficheros .java. Al compilarlos obtenemos varios ficheros .class (uno por fichero .java), y no un nico fichero ejecutable como ocurre en otros lenguajes. Para colmo, a menudo la aplicacin est formada no slo por los ficheros .class sino que usa ficheros de sonido (usualmente .au en Java), iconos, etc., lo que multiplica la cantidad de ficheros que forman la aplicacin compilada. Esto hace que "llevarse" la aplicacin para ejecutarla en un ordenador diferente resulte un poco lioso: olvidar cualquiera de los ficheros que componen la aplicacin significara que sta no va a funcionar correctamente. En el caso de un applet se aade el problema de la velocidad, al tener que viajar todos los ficheros a travs de internet. Los ficheros Jar (Java ARchives) permiten recopilar en un slo fichero varios ficheros diferentes, almacenndolos en un formato comprimido para que ocupen menos espacio. Es por tanto, algo similar a un fichero .zip (de hecho estn basados en ficheros .zip). Entonces, dnde est la "gracia"? No se podrn usar directamente ficheros .zip? La particularidad de los ficheros .jar es que no necesitan ser descomprimidos para ser usados, es decir que el intrprete de Java es capaz de ejecutar los archivos comprimidos en un archivo jar directamente. Por ejemplo, si hemos recopilado todos los ficheros necesarios para ejecutar una aplicacin en un fichero "aplic.jar", podemos lanzar la aplicacin desde una terminal de texto mediante:
java -jar aplic.jar

Vamos a ver ahora cmo se crean los ficheros .jar.

2 Creacin en un terminal de texto


Hemos visto que se puede lanzar una aplicacin llamando al intrprete de java (comando java) seguido de -jar y del nombre del fichero .jar correspondiente. Sin embargo hay algo en todo esto que no "encaja": Si el fichero .jar contiene muchos ficheros .class, cul de todos se ejecuta? Sabemos que debe ejecutarse el que contiene el mtodo main pero,

cmo sabe el intrprete de Java que clase de todas las del fichero contiene este mtodo? La respuesta es que lo sabe porque se lo tenemos que decir durante la creacin del fichero jar. Y la forma de hacerlo es un poco liosa. Vamos a verlo paso a paso. Para simplificar suponemos que estamos en un terminal de texto (consola Linux o smbolo del sistema en Windows), que el comando jar es accesible (es decir, la carpeta que contiene jar.exe est en el Path) y que nos encontramos en el directorio donde se encuentran los ficheros .class que deseamos "empaquetar". Crear un directorio META-INF (las maysculas son importantes!) y dentro un fichero MANIFEST.MF. Este fichero indica, entre otras cosas, cual ser la clase principal. A menudo el fichero MANIFEST.MF contiene una nica lnea:
Main-Class: Principal

indicando que Principal.class es la clase que contiene el mtodo main. Observacin : El fichero MANIFEST.MF se puede crear con cualquier editor de texto. Hay que introducir un fin de lnea (enter) tras la ltima linea con texto. Crear el fichero .jar mediante el comando
jar cfm fich.jar META-INF/MANIFEST.MF *.class

El nombre fich.jar es el que nosotros queramos y corresponde al fichero .jar que se crear conteniendo todos los ficheros indicados (en este caso todos los ficheros .class). Se puede comprobar que el contenido del fichero es el el adecuado escribiendo:
jar tf fich.jar

que mostrar la lista de clases contenidas en el fichero. Este comando tambin puede ser til para examinar el contenido de las libreras del sistema. Para lanzar el archivo basta con teclear ahora:
java -jar fich.jar

Si alguna vez se quiere "desempaquetar" el contenido de un archivo jar se pueden usar las opciones "xf":
jar fich.jar

Esto puede resultar particularmente til si queremos echar un vistazo a algunos paquetes del sistema que vienen de esta forma.

3 Applets
Aunque an no sepamos demasiadas cosas sobre applets este es un buen punto para indicar como se debe usar la herramienta jar en relacin a los applets. Vamos a verlo con un ejemplo: supongamos que tenemos un applet de nombre TicTacToe.java. Suponemos que ya est compilado, es decir que ya existe el fichero TicTacToe.class. Adems suponemos que este applet utiliza imgenes, que se encuentran en una carpeta images y sonidos que se encuentran en una carpeta sounds. Es decir, tenemos (resultado de hacer

"dir" en un smbolo del sistema): Queremos crear un fichero .jar para guardar toda esta informacin en un nico fichero, que ser el que "viaje" por internet. Para ello se hace:
jar -cf titac.jar TicTacToe.class audio images

Como se puede ver no se ha incluido el fichero TicTacToe.java (porque no es necesario para la ejecucin del programa, aunque se podra haber incluido si se hubiera querido). Ya tenemos el fichero tictac.jar creado. Para cargar el applet desde una pgina html slo debemos copiar este fichero a la misma carpeta donde este la pgina. La pgina por su parte debe incluir un cdigo similar al siguiente cdigo para "incrustar" el programa Java:
<applet code="TicTacToe.class" archive="tic.jar" width="120" height="120"> </applet>

4 Creando ficheros .jar desde JCreator


Se puede configurar JCreator para llamar al comando jar. Brevemente estos son los pasos a seguir una vez: Dentro del men Configure elegir la opcin Options . En la ventana que aparece, hacemos click sobre la palabra Tools que aparece en la lista de la izquierda. La pantalla tendr el aspecto:

(salvo porque la parte derecha no estar vaca si ya hemos introducido otras herramientas como los accesos a javadoc). Pulsar el botn New y del men desplegable que aparece elegir la opcin: Create Jar File . Pulsamos "OK" y ya tenemos JCreator para crear ficheros .jar con el contenido del proyecto que tengamos Java, sin ms que pulsar el botn de herramientas que hayamos configurado (la llave inglesa con el nmero correspondiente, por ejemplo 1 si es la primera herramienta que configuramos). De todas formas hay que hacer algunas observaciones:

Un fallo (gordo) de esta herramienta es que no crea un fichero MANIFEST adecuado. Esto hace que el "empaquetamiento" sea til para applets (donde el fichero MANIFEST no importa), pero no para aplicaciones con main. El fichero generado lleva el nombre del proyecto (y extensin .jar, obviamente). Queda almacenado en el directorio del proyecto de JCreator. A menudo pare encontrarlo lo ms fcil es usar el buscador de Windows.

Leer los archivos JAR


(Febrero de 2005)

Crear archivos JAR


Los archivos JAR (Java Archive) son la forma sencilla y eficiente de transportar recursos. Con un archivo JAR facilitamos la distribucin e instalacin de una gran variedad de archivos, applets, video, sonido, imgenes, texto, etc. Adems un archivo JAR puede contener firmar digitales que aseguran la integridad y autenticidad de los datos. Para las clases (.class) la utilidad es doble: puede empaquetar sus clases y colocar el archivo JAR en el CLASSPATH. Adems puede poner sus applets en un JAR y sealar dicho archivo en el parmetro ARCHIVE de la etiqueta APPLET de HTML. La compresin JAR es del tipo ZLIB. En el siguiente ejemplo empaquetamos archivos de sonido en un archivo JAR por medio de la utilidad jar que viene con el JDK. Para crear el archivo JAR:

jar -cvf sonidos.jar adagio_barber.mid ....[el resto de archivos que se incluyen] Para visualizar las entradas (archivos) que estn en el JAR:

jar -tvf sonidos.jar Que nos muestra por pantalla:

0 Thu Apr 22 17:50:32 CEST 2004 META-INF/ 71 Thu Apr 22 17:50:32 CEST 2004 META-INF/MANIFEST.MF 8232 Thu Apr 22 17:13:40 CEST 2004 adagio_barber.mid 9085 Mon Mar 29 05:03:12 CEST 2004 canon_pachelbel.mid 29070 Sat Mar 13 03:44:16 CET 2004 highway40blues.mid 10889 Thu Apr 22 17:38:06 CEST 2004 ghost_riders_in_the_sky.mid MANIFEST.MF, situado en el directorio META-INF, es un archivo de informacin sobre versiones y control. Para nuestro caso no ser necesario que lo utilicemos. Si quisiramos extraer el contenido usaramos:

jar -xvf sonidos.jar

Extraer informacin del archivo JAR


Vamos a plantear un applet de ejemplo, que tiene un archivo JAR con los siguientes contenidos: El archivo .class del applet Archivo de audio (.mdi) Archivo de video (.gif)

El applet lo puede ver ms abajo. En la parte superior aparece una lista que contiene informacin sobre el archivo JAR y las entradas del archivo. En la parte inferior puede ver la imagen contenida en el JAR (si no la ve bien, presione 'Actualizar').

Respecto a las URLs lo ms importante es entender que:

La URL absoluta del archivo JAR empieza sealando el protocolo (jar:) Al final del nombre del archivo JAR hay una exclamacin (por ejemplo: pack.jar!). Las URLs de las entradas (archivos contenidos) se construyen simplemente aadiendo su path al final de la URL del archivo JAR. Por ejemplo:

jar:http://www.proactivacalidad.com/java/archivos/jar/pack.jar!/ (archivo JAR) jar:http://www.proactivacalidad.com/java/archivos/jar/pack.jar!/canon_pachelbel.mid (archivo audio) Para la extraccin del archivo .class el proceso es automtico. Lo nico que hay que hacer es indicar su nombre en el parmetro ARCHIVE de la etiqueta APPLET de HTML:

code="docen_archivos.applet_jar.class" archive="jar/pack.jar" Respecto a la extraccin y reproduccin de los archivos de audio o imagen hay que cumplir con varios pasos: 1. Primero, hay que crear una URL de cada uno de los archivos contenidos: 2. 3. URL url_audio = new URL( "jar:" + getCodeBase().toString() + "jar/pack.jar!/canon_pachelbel.mid" ); 4. URL url_imagen = new URL( "jar:" + getCodeBase().toString() + "jar/pack.jar!/buho.gif" ); 5. A partir de la URL obtener el objeto imagen (clase Image) y audio (AudioClip): 6. 7. audio = getAppletContext().getAudioClip( url_audio ); // Consigo un AudioClip 8. imagen = this.getImage( url_imagen ); // Consigo un Image

9. La reproduccin de la imagen es un asunto sencillo que ya hemos tratado. Lo esencial es


10. 11. llamar a drawImage(): public void paint(Graphics g) { Rectangle rec = g.getClipBounds(); 13. int ancho_imagen = imagen.getWidth( this ); 14. int alto_imagen = imagen.getHeight( this ); 15. g.drawImage( imagen, rec.width/2 - ancho_imagen/2, rec.height/2, this ); 16. }

12.

17. El archivo de audio se reproduce de manera simple: 18. 19. audio.play();

El lector podra poner una objecin: en este ejemplo ya sabiamos lo que contiene el archivo JAR, en especial ya conociamos los nombres y extensiones de los archivos de audio e imagen. Pero puede darse el caso de que no lo conozcamos previamente, supongamos que necesitamos listar todos los archivos de audio y no sabemos sus nombres. Hay una solucin para esto, que de forma breve se denomina "obtener las entradas de un archivo JAR". Los pasos a seguir:

Obtener un objeto de la clase JarFile. Recorrer una a una las entradas (clase JarEntry) que componen el JarFile. Puedo obtener el nombre de la entrada llamando al mtodo getName() de un JarEntry; en nuestro caso aadimos el nombre a una lista (clase List): JarEntry entry; for (Enumeration e = jar.entries(); e.hasMoreElements(); ) { entry = (JarEntry) e.nextElement(); lista.add(entry.getName()); // Aadir a la lista }

package docen_archivos; import import import import import import import import import import import import import import import java.awt.*; java.awt.event.*; java.applet.Applet; java.applet.AudioClip; java.net.URL; java.net.URLConnection; java.net.JarURLConnection; java.io.IOException; java.io.FileNotFoundException; java.net.MalformedURLException; java.lang.SecurityException; java.util.jar.JarEntry; java.util.jar.JarFile; java.util.Vector; java.util.Enumeration;

/****************************************************************** * Clase que descarga un grfico y un archivo midi del archivo JAR. * Reproduce el archivo de audio. * Pone una lista con informacin de archivos en mitad superior del applet. * Pinta imagen en mitad inferior del applet *****************************************************************/ public class applet_jar extends Applet { List lista = new List(); Image imagen; AudioClip audio = null;; /************** Inicializar el applet *********************/ public void init() { try { jbInit(); } catch (Exception e) { e.printStackTrace(); } } /****************** Inicializacin de componentes **********/ private void jbInit() throws Exception {

this.setLayout( new GridLayout(2,1)); filasxcolumnos definir_lista(); cargar(); en lista) if (audio != null) audio.play();

// Divido el applet en

// Pone entradas de JAR en lista // Carga de audio e imagen (tambin escribe // Si el audio no es nulo, se reproduce

inicio }

add(lista); repaint(); // Para asegurar que se ve bien la imagen desde el

/*** Pinto la imagen centrada y en mitad inferior del applet ***/ public void paint(Graphics g) { Rectangle rec = g.getClipBounds(); int ancho_imagen = imagen.getWidth( this ); int alto_imagen = imagen.getHeight( this ); g.drawImage( imagen, rec.width/2 - ancho_imagen/2, rec.height/2, this ); } /***************** Al destruir el applet se para la msica *********/ public void destroy() { if (audio != null) audio.stop(); } /****************************************************************** ****** * Escribe en la lista: 1) URL ABSOLUTA del archivo JAR y 2) URLs RELATIVAS * de las entradas del JAR. ****************************************************************** *****/ void definir_lista() { try { /****** Consigo un JarFile a partir de la URL *****/ URL url = new URL("jar:" + this.getCodeBase().toString() + "jar/pack.jar!/"); Ja

Firmar applet
Para firmar un applet debes seguir los siguientes pasos: 1. Crear un archivo jar 2. Generar clave

3. Firmar applet 1. Para crear un archivo jar utiliza la siguiente sentencia jar cvf tuArchivoJar.jar tuClase1.class tuClase2.class image01.jpg etc 2. Luego creas una entrada en el almacen de claves: keytool -genkey -alias tuAlias -validity 360 -v Al momento de ejecutar esta sentencia te solicitara que ingreses algunos datos, los cuales apareceran en el certificado al momento de ejecutar el applet. 3. Firmas el applet: jarsigner.exe tuArchivoJar.jar tuAlias -verbose Con esto es suficiente para firmar un applet

Cmo firmar applets para Netscape

Lo primero que se necesita es hacerse con las herramientas necesarias. En primer lugar, hay que notar que para poder firmar un applet que va a acceder a recursos restringidos, como el sistema de ficheros, propiedades del sistema o conexiones de red, se necesita alterar el cdigo fuente del applet, incluyendo llamadas a ciertas funciones para garantizar los privilegios requeridos. Estas clases constituyen lo que se denomina el Netscape Java Capabilities API. Por otro lado, se requiere la herramienta de firmado, conocida como SignTool 1.1. Una vez armados con este arsenal, se puede proceder ya a firmar applets, siguiendo los siguientes pasos.

Paso 1: Crear un certificado para firmar applets


El primer paso consiste tambin en adquirir un certificado adecuado de una autoridad de certificacin. Hay que asegurarse de que la autoridad elegida emite certificados que permitan firmar software, los de clase 2 para uso personal y los de clase 3 para aplicaciones comerciales. VeriSign puede ser de nuevo la eleccin adecuada. Se pueden consultar ms autoridades propuestas por Netscape, aptas para certificar sus productos. En este caso, y como slo se necesita para hacer pruebas, se crear un certificado de prueba, que es gratis, utilizando la citada herramienta SignTool 1.1.

Antes de instalar claves y certificados nuevos en las bases de datos de Netscape Communicator, es imprescindible crear una contrasea para acceder a la base de datos. Para hacerlo, se pulsa el botn de Seguridad en la barra de herramientas de Communicator, se elige Passwords y despus se pulsa el botn de Establecer Passwords para crearlo. Otro aviso importante es que para ejecutar SignTool se debe cerrar antes todas las ventanas abiertas de Communicator, ya que en caso contrario se corre el riesgo de corromper las bases de datos de claves y certificados. Para generar un certificado de prueba se utiliza la opcin -G seguida de un nombre y la opcin -d para indicar el directorio donde se encuentra la base de datos de certificados (el fichero cert7.db) y claves (el fichero key3.db) de Communicator. Por ejemplo, para crear un certificado para Gonzalo del CSIC, se puede escribir lo siguiente (en negrita aparece lo que se debe introducir en la lnea de comandos): signtool -G gonzalo -d c:\netscape\users\gonzalo using certificate directory: c:\netscape\users\gonzalo Enter certificate information. All fields are optional. Acceptable characters are numbers, letters, spaces, and apostrophes. certificate common name: Certificado para pruebas organization: CSIC organization unit: TIC state or province: Madrid country (must be exactly 2 characters): ES username: gonzalo email address: gonzalo@iec.csic.es Enter Password or Pin for "Communicator Certificate DB": [no se produce eco] generated public/private key pair certificate request generated certificate has been signed certificate "gonzalo" added to database Exported certificate to x509.raw and x509.cacert. Si en el paso anterior se especific la opcin -d junto con el camino donde se encuentra la base de datos de claves y de certificados de Communicator, la base ya ha quedado automticamente actualizada. La prxima vez que se arranque Communicator, si se pulsa el botn de Seguridad de la barra de herramientas, en Certificados y a continuacin en Propios se comprobar que aparece el recin creado. Se puede comprobar que el certificado se ha instalado correctamente tambin mediante signtool, con la opcin -l: signtool -l using certificate directory: . Object signing certificates --------------------------------------gonzalo Issued by: gonzalo (Certificado para pruebas) Expires: Sun Apr 11, 1999

--------------------------------------For a list including CA's, use "signtool -L" Con este certificado ya se est listo para firmar applets. Ahora bien, no basta con firmarlos. Para que los usuarios puedan ejecutar applets firmados es necesario que instalen en su versin de Communicator el certificado que se acaba de generar. Si se hace un listado del directorio donde se est trabajando, se observar que signtool ha creado dos ficheros automticamente, x509.cacert y x509.raw. El primero de ellos contiene el certificado en formato base64. Para que quede a disposicin de cualquiera que lo necesite, se seguirn los siguientes pasos:

Crear un enlace al fichero x509.cacert en una pgina Web Por ejemplo, puede aadir la siguiente lnea en HTML a su pgina personal para que los visitantes que deseen ejecutar sus applets sepan dnde obtener su certificado: Primero debes instalar mi <a href="x509.cacert">certificado</a>. Asegurarse de que el servidor Web exporta el fichero como MIME-type application/x-x509-ca-cert Los servidores de Netscape estn configurados as por defecto y tambin algunos servidores Unix. No as el Internet Information Server de NT, por lo que habr que configurarlo para que asocie ese tipo MIME a la extensin .cacert. Instalar el certificado Una vez que esos pasos han sido seguidos, basta con pinchar en el enlace anterior para que automticamente se lance el proceso de instalacin de certificados de Netscape. Siguiendo las instrucciones del proceso, muy sencillo, se instalar el certificado en el navegador del usuario, que podr a partir de ahora ejecutar correctamente todos los applets firmados con este certificado.

Paso 2: Crear un applet con privilegios


Antes de traspasar los lmites del recinto de seguridad, los applets tienen que pedir permiso educadamente. La manera como se consigue es mediante el API de capacidades. Cada vez que un applet quiere efectuar alguna accin restringida, debe pedir permiso al navegador para ver si ste se lo concede, para lo cual se sirve de las funciones contenidas en esta API. Cuando el applet le pide permiso al navegador, ste busca en su base de datos si existe una entrada para el firmante del applet y si la accin le est permitida. Caso de no existir ninguna entrada, el navegador presenta una ventana pidiendo confirmacin antes de conceder el permiso. El usuario decide si garantiza o deniega el permiso, con la posibilidad de almacenar la decisin en la base de datos para futuras referencias. La forma de modificar el applet consiste en preceder todas las llamadas a recursos protegidos de una llamada al gestor de privilegios. Por ejemplo, para solicitar privilegios antes de leer propiedades del sistema, la funcin en Java que lee los privilegios ir precedida de: PrivilegedManager.enablePrivilege("UniversalPropertyRead"); Para leer/crear/escribir ficheros, se precedera el bloque de funciones correspondiente por:

PrivilegedManager.enablePrivilege("UniversalFileAccess"); Y as con distintas llamadas para cada tipo de recurso. Una vez terminadas las operaciones que requieren privilegios, constituye una buena prctica revocar los privilegios concedidos, utilizando la siguiente funcin: PrivilegeManager.revertPrivilege("UniversalPropertyRead"); Puedes consultar el listado completo de los recursos que se pueden acceder. La documentacin completa sobre este API donde se detalla su funcionamiento se puede obtener gratuitamente. El mayor inconveniente de este enfoque es que exige la modificacin del applet y adems, como consecuencia de los cambios introducidos, no funcionar ya en ningn otro navegador, tirando por tierra la filosofa de Java de "Escribir una vez, ejecutar en cualquier sitio".

Paso 3: Firmar y empaquetar los ficheros con las clases


En vez de firmar el fichero con todas las clases compactadas, como se haca en el caso de IE, primero se crea un directorio al que se copian todas las clases que componen el applet y a continuacin se firma el directorio utilizando la herramienta SignTool. La propia herramienta se encarga de generar un fichero comprimido con todas las clases y dems ficheros que se hayan copiado en el directorio. Este fichero recibe el nombre de Archivo Java (JAR). En versiones anteriores esta herramienta se llamaba zigbert, pero con la versin actual de SignTool ha quedado obsoleta. En el caso supuesto de que se quiera firmar la clase abednego.class, se copiar a un directorio al que se llamar abednego y se ejecutar el programa SignTool, pasndole la clave del certificado almacenada en la base de datos de Communicator, que se acaba de generar en el paso 1. Por ejemplo: signtool -k gonzalo -Z abednego.jar abednego using certificate directory: . Generating abednego/META-INF/manifest.mf file.. --> abednego.class adding abednego/gon.txt to abednego.jar...(deflated 0%) Generating zigbert.sf file.. Aqu pide el password: Enter Password or Pin for "Communicator Certificate DB": [no se produce eco] Si se ha introducido correctamente, contina: adding abednego/META-INF/manifest.mf to abednego.jar...(deflated 14%) adding abednego/META-INF/zigbert.sf to abednego.jar...(deflated 27%) adding abednego/META-INF/zigbert.rsa to abednego.jar...(deflated 43%) tree "abednego" signed successfully

Ahora ya est disponible el fichero abednego.jar para distribuirlo con su firma incorporada. Se puede verificar que el proceso se ha realizado correctamente utilizando la opcin -v: signtool -v abednego.jar using certificate directory: . archive "abednego.jar" has passed crypto verification. status path ------------ ------------------verified abednego.class

Paso 4: Incrustar el JAR en la pgina web


En este caso la etiqueta <applet> tambin cambia ligeramente para permitir la insercin del archivo JAR: <applet code=abednego.class archive=abednego.jar width=320 height=200> </applet> Es importante eliminar el fichero abednego.class original del directorio, ya que en caso contrario el navegador lo cargara, en lugar del firmado. Ahora ya se puede visualizar correctamente el applet en Communicator. En cada ocasin en la que el applet necesite acceder a un recurso protegido, al usuario se le presentar una ventana de advertencia, en la que se le informa de los permisos que est solicitando ese applet, acompaados de una estimacin del riesgo potencial derivado de su concesin. Siempre y cuando no se active la casilla para recordar la decisin, esta ventana aparecer cada vez que el applet intente acceder de nuevo a ese recurso. En la figura se muestra la informacin del certificado que el usuario puede comprobar pulsando el botn Certificado en la ventana anterior. Obsrvese cmo los datos corresponden a los que se introdujeron en el paso 1.

Ejemplos de applets para Netscape Communicator


Puedes ver un ejemplo operativo con su cdigo fuente disponible en:

Renegado: esta applet gozar de los privilegios necesarios para acceder a las propiedades del sistema y al disco.

Das könnte Ihnen auch gefallen