viernes, 11 de enero de 2008

Identificación de entregables en Java

Es importante que los aplicativos en producción desplieguen en algún lugar visible su número de versión, de ésta forma cuando los usuarios reportan incidentes, podemos solicitar que incluyan el "Program-Version" para intentar reproducir el problema en nuestro ambiente de desarrollo.

Por ejemplo, en las aplicaciones web desarrolladas en Java siempre trato de incluir en el war (el componente que se instala en el servidor), un timestamp que sirva como clave de identificación de la versión y a la vez permita saber en que fecha fue generado.
Ésto lo resuelvo en la tarea ANT que empaqueta el war:


<tstamp><format property="hoy" pattern="yyyyMMddHHmmss" locale="en"/></tstamp>
<target name="make.war" depends="build">
<jar destfile="aplicacion.war" >
<manifest>
<attribute name="Manifest-Version" value="1.0"/>
<attribute name="Program-Version" value="${hoy}"/>
</manifest>
<fileset dir="${webapp.dir}"/>
</jar>
</target>

Como resultado, el war queda con un archivo llamado MANIFEST.MF con un formato clave=valor (Program-Version=20071218112500, si lo generé el 18 de diciembre de 2007 a las 11:25 de la mañana) dentro del directorio META-INF. Luego podré leerlo y mantenerlo en memoria desde un servlet, por ejemplo:

URL manifestURL = this.getServletContext().getResource("/META-INF/MANIFEST.MF");
Manifest mf = new Manifest(manifestURL.openStream());
Attributes attr = mf.getMainAttributes();
String programVersion = attr.getValue("Program-Version");
this.getServletContext().setAttribute("programVersion", programVersion);

y desde una página JSP podré desplegarlo simplemente usando un tag JSTL, por ejemplo:

<c:out value='${programVersion}'/>

Espero que les sea de utilidad, hasta el próximo post!

5 comentarios:

dpinya dijo...

Algo más simple que utilizo yo habitualmente es crear con el taget del ant que genera el war un fichero llamado version en la raíz de la aplicación que contiene el número de versión, y que se incluye dentro del war, y así puedes consultarlo fácilmente sin necesidad de servlet ni JSP.

Federico Varela dijo...

¿Pero el usuario que ejecuta la aplicación como consulta la versión si no tiene acceso al war?
Lo hago de esa manera porque tengo una jsp (que es incluida por todas las demás) que muestra ese dato en una esquina, junto al usuario logueado.

Saludos

dpinya dijo...

Al ser un fichero de texto, lo puede consultar simplemente haciendo http://www...../version

Pablo Viojo dijo...

Interesante para los que tenemos que gestionar varias versiones a la vez. Tienes idea si se puede hacer con Maven?

Saludos

Federico Varela dijo...

Pablo,

Por lo que conozco de maven, se podría hacer tanto lo que propone dpinya como lo que publiqué en el post.
Para incluir el manifest en el war, está muy bien explicado en la siguiente guía:
War Manifest Customization

Saludos