Servidor Java Web Start - Jnlp

En la anterior entrada vimos como crear un jar firmado, esto es, preparado para una aplicación jnlp. Ahora entraremos en cómo configurar un servidor, para servir esta especie de "Hola Mundo jnpl".
Recopilando lo necesario:
Un jar firmado.
Un servidor web (Tomcat en nuestro caso).
Un archivo jnlp

Resulta aconsejable un servlet que gestione el  archivo jnlp.

Empecemos por nuestro archivo jnlp:

<jnlp spec="1.5+"
  codebase="$$codebase"
  href="$$name">
  <information>
    <title>Aplicación JNLP</title>
    <vendor>Andres Gaudioso</vendor>
    <homepage href="$$context"/>
    <description>Primera Prueba de JNLP</description>
    <description kind="short">Testeando JNLP</description>
    <offline-allowed/>
  </information>
  <security>
    <all-permissions/>
  </security>
  <update check="timeout" policy="always"/>
  <application-desc main-class="es.home.App" />
  <resources>
     <j2se version="1.6+" java-vm-args="-Xms128M -Xmx1024M"/>
     <jar href="jnplcode-1.0.jar" main="true">
     </jar>
    </j2se>
  </resources>
</jnlp>

En la web se puede encontrar información sobre la estructura de este archivo, además como cualquier archivo xml es autoexplicativo. Destacar únicamente que hemos introducido unos parámetros $$codebase, $$name, $$context que son los que nos va a instanciar el servlet, si no quisiesemos utilizar el servlet de jnlp deberíamos dar valor a dichos parámetros. ¿Cual es el problema de esto? que estaríamos metiendo "hardcodeado" la url de dónde se va a desplegar. Otra opción menos elegante pero efectiva sería parsear el jnlp que está en el servidor y entregar el jnlp con los valores apropiados.
Piensa que sin esos "parámetros" nuestro jnlp debería ser algo como esto:

<jnlp spec="1.5+" 
 codebase="http://192.168.2.52:7777/serverjnlp/jnlps" href="http://192.168.2.52:7777/serverjnlp/jnlps/jnplcode-1.0.jnlp"> 
 <information> 
   <title>Aplicación JNLP</title> 
   <vendor>Andres Gaudioso</vendor> 
   <homepage href="http://192.168.2.52:7777/serverjnlp/index.html"/>

 Que es fuertemente dependiente de la URL donde finalmente se va a desplegar. Sun  (Oracle) nos proporciona un servlet que automaticamente nos parsea los jnlp y le da los valores apropiados. El servlet en cuestión es "jnlp.sample.servlet.JnlpDownloadServlet".
Vamos a configurarlo en el descriptor de despliegue, el web xml.
 Añadimos la definición del servlet

<servlet>
        <servlet-name>JnlpDownloadServlet</servlet-name>
        <servlet-class>jnlp.sample.servlet.JnlpDownloadServlet</servlet-class>
    </servlet>



y le decimos cuando tiene que actuar, cuando alguien pida algo con extensión jnlp


    <servlet-mapping>
        <servlet-name>JnlpDownloadServlet</servlet-name>
        <url-pattern>*.jnlp</url-pattern>
     </servlet-mapping>

En el momento que vea una petición de un archivo jnlp, nos entregará el dicho jnlp con el context, el param y el name poblados correctamente, una maravilla.
¿Pero dónde está dicho servlet? Vamos a instalarlo en nuestro repositorio maven para poder añadirlo como dependencia. Según parece desde java 1.5 nos lo entregan con el jdk. Para importarlo desde el eclipse al repositorio vamos a File, Import y dentro de Maven seleccionamos "Install or deploy an artifact to a Maven repository" en "Artifact file" deberemos seleccionar el jar que contiene el servlet, dicho jar está en la carpeta sample del jdk. En mi caso en "jdk1.6.0_30\sample\jnlp\servlet" está el archivo "jnlp-servlet.jar" que será el que selecciono. Le asignamos un groupId para almacenarlo, en mi caso "webstart" y le damos un nombre de artefacto "jnlpservlet", por ejemplo. Una vez instalado en nuestro repositorio ya podemos añadirlo como dependencia en el pom de nuestra aplicación web. 
En mi caso el pom queda como sigue:
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-core</artifactId>
            <version>3.0.5.RELEASE</version>
        </dependency>
            <dependency>
            <groupId>webstart</groupId>
            <artifactId>jnlpservlet</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

.....


Ya tengo el war preparado para servir jnlp. En la carpeta webapp creo una carpeta llamada "jnlps" y dentro de ella meto el archivo jnlp y el jar creado en la entrada anterior del blog, que va firmado. En el partado resources del jnlp se ve que el nombre es "jnplcode-1.0.jar".
Lo único que queda es hacer visible al mundo este jnlp desde un jsp con el siguente código:

Enlace al jnlp <s:a href="jnlps/jnplcode-1.0.jnlp" > <img src="img/jnlplaunch.png" /></s:a>


 (Las etiquetas s son que es un proyecto con struts2 y que le he puesto una imagen al enlace)





Comentarios