Beruflich Dokumente
Kultur Dokumente
1 Qu son los ficheros JAR? 2 Creacin en un terminal de texto 3 Applets 4 Creando ficheros .jar desde JCreator
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>
(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.
jar -cvf sonidos.jar adagio_barber.mid ....[el resto de archivos que se incluyen] Para visualizar las entradas (archivos) que estn en el JAR:
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:
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').
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
12.
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 }
/*** 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
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.
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.
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".
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
Renegado: esta applet gozar de los privilegios necesarios para acceder a las propiedades del sistema y al disco.