Los archivos JAR (Java Archive) son la forma sencilla y eficiente de transportar recursos. Con un archivo JAR facilitamos la distribución e instalación de una gran variedad de archivos, applets, video, sonido, imágenes, texto, etc. Además 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. Además puede poner sus applets en un JAR y señalar dicho archivo en el parámetro ARCHIVE de la etiqueta APPLET de HTML. La compresión 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 están en el JAR:
jar -tvf sonidos.jar
Que nos muestra por pantalla:
MANIFEST.MF, situado en el directorio META-INF, es un archivo de información sobre versiones y control. Para nuestro caso no será necesario que lo utilicemos. Si quisiéramos extraer el contenido usaríamos:
jar -xvf sonidos.jar
Vamos a plantear un applet de ejemplo, que tiene un archivo JAR con los siguientes contenidos:
El applet lo puede ver más abajo. En la parte superior aparece una lista que contiene información 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 más importante es entender que:
jar:http://www.proactiva-calidad.com/java/archivos/jar/pack.jar!/ (archivo JAR) jar:http://www.proactiva-calidad.com/java/archivos/jar/pack.jar!/canon_pachelbel.mid (archivo audio)
Para la extracción del archivo .class el proceso es automático. Lo único que hay que hacer es indicar su nombre en el parámetro ARCHIVE de la etiqueta APPLET de HTML:
code="docen_archivos.applet_jar.class" archive="jar/pack.jar"
Respecto a la extracción y reproducción de los archivos de audio o imagen hay que cumplir con varios pasos:
URL url_audio = new URL( "jar:" + getCodeBase().toString() + "jar/pack.jar!/canon_pachelbel.mid" ); URL url_imagen = new URL( "jar:" + getCodeBase().toString() + "jar/pack.jar!/buho.gif" );
audio = getAppletContext().getAudioClip( url_audio ); // Consigo un AudioClip imagen = this.getImage( url_imagen ); // Consigo un Image
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 );
}
audio.play();
El lector podría poner una objeción: 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 solución para esto, que de forma breve se denomina "obtener las entradas de un archivo JAR". Los pasos a seguir:
JarEntry entry;
for (Enumeration e = jar.entries(); e.hasMoreElements(); ) {
entry = (JarEntry) e.nextElement();
lista.add(entry.getName()); // Añadir a la lista
}
Tiene acceso al código fuente