Problema:

Programando un template para generar PDFs usando la librería iText en un proyecto J2EE necesité cargar una imagen que se encontraba dentro de la estructura estándar de un archivo .war (Web ARchive)

Las javadocs a diferencia de documentaciónes como las API de Ruby o Python no son explicitas con estos temas, así es que me tomó algún tiempo inferir la forma de hacerlo, por tanto lo muestro aquí como parte de las bases de conocimientos de Continuum.

Nota: Esta forma es genérica, sirve para cargar cualquier recurso, o sea archivos txt, jpg, o xml.

Solución:

La clave esta en el método getRealPath() de la interface javax.servlet.ServletContext (implementada por el container Web J2EE del servidor de aplicaciones donde se deploya o instala la aplicación, así que no se pongan a buscar una implementación :P

Este método retorna el camino físico donde se encuentra el recurso en el servidor independientemente del sistema operativo, o sea resuelve los separadores (‘/’ o ‘\’).

ServletContext sc = request.getSession().getServletContext();
String imgPath = sc.getInitParameter("img-location");
Image img = Image.getInstance(sc.getRealPath(imgPath) + "/imagen.jpg");

Donde ‘img-location‘ fue definido como un parámetro de contexto en el archivo web.xml y contiene el camino local (o sea dentro del .war) de las imágenes:

<context-param>
    <param-name>img-location</param-name>
    <param-value>/extras</param-value>
</context-param>

Esto significa que si por ejemplo la aplicación tiene como conexto web “MYAPP” y fue instalada en un tomcat, y TOMCAT_HOME = /usr/share/tomcat5.5, entonces el camino físico deberá apuntar a

/usr/share/tomcat5.5/webapps/MYAPP/extras