domingo, 20 de octubre de 2013

Lanzador de programas Java para Linux

Hace un tiempo tuve que mirar el asunto del deployment o despliegue de aplicaciones Java y pude ver cómo se recomienda el uso de scripts en el sistema operativo de destino para manejar la invocación del runtime java y el paso de parámetros al programa. En el caso de que éste se distribuya como un archivo JAR y se trate de una aplicación con GUI (interfaz gráfica de usuario) no es necesario, y lo más sencillo sería crear un lanzador o acceso directo al archivo JAR aprovechando que dicha extensión suele asociarse al runtime. El uso de un script intermediario tiene realmente sentido cuando el programa es de línea de comandos (sí, también se pueden hacer en Java ;) y se quiere invocar de forma fácil (como cualquier comando del sistema) desde una terminal y pasándole los argumentos necesarios. Como los ejemplos oficiales de script bash son demasiado sencillos y limitados, me propuse mejorarlos un poco. Mi idea era que el programa Java se instale en el sistema mediante un script de instalación o un paquete (.deb, .rpm, etc.) compatible con el gestor de software correspondiente. El archivo .jar (o los archivos .class junto a los archivos auxiliares de recursos, documentación, etc.) se instalaría en un directorio propio bajo /usr/share u otra ruta conveniente. En ese mismo directorio residirá el script lanzador al que yo he llamado jlauncher y que tendrá un enlace simbólico (creado durante la instalación) en un directorio de ejecutables estándar (p. ej. /usr/bin). El nombre del link será igual al del archivo JAR o la clase principal del programa pero en minúsculas (p. ej. jpodcastdl). Y el resto lo hace el código del script, que buscará la clase Java o el archivo .jar de nombre relacionado con el que se usó para invocarlo y ejecutará el runtime de Java con las opciones pertinentes y pasándole los argumentos necesarios. El código quedaría más o menos así:

#!/bin/bash

# jlauncher - lanzador para programas CLI hechos en Java

java=$(which java)

if [ -z "$java" ]; then
    echo "$(basename $0): error: falta el runtime de Java necesario">&2
    exit 1
fi

dir_name=$(dirname $(readlink $0))
script_name=$(basename $0)
class_name=$(ls -1 $dir_name | grep -i "$script_name.class")

if [ -z "$class_name" ]; then
    jar_name=$(ls -1 $dir_name | grep -i "$script_name.jar")
    if [ -n "$jar_name" ]; then
        java -jar $dir_name/$jar_name "$@"
    fi
else
    java -cp $dir_name ${class_name%.class} "$@"
fi

Otra cosa es que alguien elija Java para hacer un programa de línea de comandos para Linux pudiendo usar, por ejemplo, Python, pero bueno, el caso era trastear un poco y de paso allanar el terreno a quien le interese hacerlo...