Level Up!

martes, 8 de junio de 2010

Empaquetar una aplicación para distribuir, desde NetBeans

Uno de los tantos motivos por lo que utilizo NetBeans en lugar de otro IDE, es que utiliza la Apache Ant para compilar, crear .jar .war .ear, javadoc, etc.. prácticamente para todo, y solo usando un archivo .xml. Y lo mejor es que se puede personalizar el .xml a nuestro antojo.

En este post se va a explicar cómo empaquetar una aplicación Swing en un archivo .zip para ser distribuido a los usuarios finales.


¿Qué hace NetBeans?

Si al hacer una aplicación Swing con NetBeans utilizamos diversas bibliotecas adicionales, el IDE nos puede crear una carpeta lista para distribuir a los usuarios incluyendo todas los .jars necesarios. Para ello hacemos clic derecho sobre el ícono del proyecto y seleccionamos "Build" (o Clean and Build)

 Al hacer esto, el NetBeans compila, y construye la carpeta "dist" para distribuir. Esta carpeta se encuentra en la misma carpeta del proyecto. Podemos verla en el panel "Files" del NetBeans (Teclas Ctrl+2)
Ahora bien ¿qué hacemos con ese .jar? En el README.TXT lo explica. Pero NetBeans también lo dice en el panel "Output" (Ctrl+4) después de construir la aplicación.

"Para ejecutar esta aplicación desde la línea de comandos sin usar Ant, intente:..." y luego dice cuál es el comando que se tiene que hacer.

Si copiamos esa línea, abrimos la ventana del Símbolo del Sistema, y pegamos esa instrucción para ejecutarlo, pues nos ejecutará la aplicación sin problemas. Es más, se podría copiar a los usuarios finales este directorio "dist" y decirles que si quieren ejecutarlo hagan esto: abrir una ventana del Símbolo del Sistema, escribir esa instrucción  y listo.........creo que al usuario no le va a gustar hacer esto ¿Por qué no mejor hacer un programa que al hacer doble clic ya se ejecuté? Buena idea.

Creando un .bat

De por sí, se puede hacer doble clic al archivo .jar para ejecutar la aplicación, pero funciona si es que en el computador del usuario no tiene algún descompresor de archivos asociado a los archivos .jar. Por ejemplo, si se tiene instalado el WinRAR, al hacer doble clic sobre el archivo .jar, en lugar de que se ejecute, se abrirá el WinRAR y mostrará el contenido del .jar... esto no es lo que queremos. La mejor manera es crear un archivo .bat que haga la llamada al comando java -jar bla bla

Esto le podemos decir al NetBeans que lo haga. Para ello, entramos al panel "Files" (Ctrl+2) y buscamos el archivo build.xml. Este es una extensión al .xml que utiliza el NetBeans para construir la aplicación.

 Abrimos este archivo, lo revisamos un poco (todo está comentado y hay algunas instrucciones) y pondremos el tag <target name='-post-jar'/> que nos permitirá realizar una tarea después de que el NetBeans haya creado el .jar
    <target name="-post-jar">        <echo file="${dist.dir}/run.bat">java -jar ${application.title}.jar</echo>    </target> 

El tag de la tarea <echo /> crea una salida a la consola, pero con el atributo file le estamos diciendo que la salida lo haga a un archivo. Para saber cuáles son los valores de las variables utilizadas en la construcción del proyecto, podemos revisar el archivo nbproject/project.properties.

Por ello utilicé las variables dist.dir, application.title.

Ahora bien, hagamos un "Build" al proyecto y veamos lo que hizo en la carpeta dist.

 Y si vemos el contenido será justamente lo que hemos pensado. Abrimos una ventana del explorador de windows, y le damos doble clic al .bat. Listo, usuario satisfecho.

Pero.. sale una ventana negra fea con el comando de ejecución de la aplicación. Bueno, esto se puede solucionar. Podemos reemplazar la instrucción
<echo file="${dist.dir}/run.bat">java -jar ${application.title}.jar</echo>
Por
<echo file="${dist.dir}/run.bat">start javaw -jar ${application.title}.jar</echo>
El comando de Windows start permite ejecutar una aplicación y "soltarlo" para que se ejecute como un proceso más del Sistema Operativo. Y el comando javaw es un comando adicional al JRE que permite ejecutar una aplicación java sin mostrar una ventana del Símbolo del Sistema.

Bien, ahora solo nos bastaría con copiar a los usuarios finales el .bat, el .jar y las bibliotecas adicionales so hubiera. Lo empaquetamos y se lo enviamos.

¿Hay un poco de flojera para comprimir los archivos? ¿y si me falta uno?

Creando un .zip

El Ant también permite comprimir archivos usando la tarea <zip />. Es realmente fácil.

Creamos el siguiente tag después del <echo />.
        <zip destfile="${dist.dir}/${application.title}.zip" basedir="${dist.dir}" />

Hagamos "Clean and Build" al proyecto, y listo, ya tenemos nuestro archivo .zip para enviar a los usuarios finales.


Y les decimos "Estimados bla bla bla, descompriman el achivo .zip para ejecutar la aplicación".
¿También tenemos flojera de enviar el mail a los usuarios? :)

Documentación

Si deseas conocer más tareas que vienen incluidas en el ANT, revisa la siguiente página.
Ahí está la tarea mail

Proyecto

Y como de costumbre, aquí está el proyecto utilizado en este ejemplo: