¿Cómo mostrar una imagen en el informe de jaspe?

Quiero mostrar una imagen en un informe de jaspe. Tengo lo siguiente en .jrxml:

    

La imagen logo.jpg está en el mismo directorio que .jrxml. Simplemente poniendo eso no funcionó para mí. Busqué en Google un poco y descubrí que el informe jasper considera lo que puse en .jrxml como una ruta relativa al directorio JVM y que para cambiar esto necesito pasar como un parámetro “REPORT_FILE_RESOLVER” un FileResolver que devuelve el archivo. Entonces, hice lo siguiente en mi .java (está ubicado en el mismo lugar que el .jrxml y la imagen)

 FileResolver fileResolver = new FileResolver() { @Override public File resolveFile(String fileName) { return new File(fileName); } }; HashMap parameters = new HashMap(); parameters.put("REPORT_FILE_RESOLVER", fileResolver); ... 

Que debería devolver el archivo esperado, pero todavía obtengo un

 net.sf.jasperreports.engine.JRException: Error loading byte data : logo.jpg at net.sf.jasperreports.engine.util.JRLoader.loadBytes(JRLoader.java:301) at net.sf.jasperreports.engine.util.JRLoader.loadBytesFromLocation(JRLoader.java:479) at net.sf.jasperreports.engine.JRImageRenderer.getInstance(JRImageRenderer.java:180) ... 

¿Qué estoy haciendo mal?

¡Gracias!

Lo he hecho pasando un parámetro que especifica la ubicación absoluta del archivo:

    

Lo hago de esta manera: la imagen se pasa por el camino:

 HashMap params = new HashMap(); params.put("logo", ClassLoader.getSystemResource("logo.jpg").getPath()); 

.jrxml

  ...     

… o la imagen se pasa como InputStream (no sé por qué, pero necesita tener el atributo onErrorType establecido en "Blank" ; de lo contrario, no funciona – arroja una excepción):

 HashMap params = new HashMap(); params.put("logo", ClassLoader.getSystemResourceAsStream("logo.jpg")); 

.jrxml

  ...     

Aquí estaba el problema:

Como dije anteriormente, tengo en el mismo directorio el .jrxml, el logo.jpg y el .java que usa el .jrxml.

Lo que pasa es que FileResolver

 FileResolver fileResolver = new FileResolver() { @Override public File resolveFile(String fileName) { return new File(fileName); } }; 

no devolvió el archivo de imagen. Descubrí que estaba mapeado en un directorio diferente y no en el que estaba esperando. Entonces, lo cambié a:

 FileResolver fileResolver = new FileResolver() { @Override public File resolveFile(String fileName) { URI uri; try { uri = new URI(this.getClass().getResource(fileName).getPath()); return new File(uri.getPath()); } catch (URISyntaxException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } }; 

Y eso funcionó. Olvidé el hecho de que:

Un camino relativo, por el contrario, debe interpretarse en términos de información tomada de algún otro nombre de ruta. De forma predeterminada, las clases en el paquete java.io siempre resuelven las rutas relativas contra el directorio de usuario actual. Este directorio es nombrado por la propiedad del sistema user.dir, y es típicamente el directorio en el que se invocó la máquina virtual Java.

(tomado de java api – Archivo (Plataforma Java SE 6) )

El directorio en el que se invocó la JVM no es el que tengo todos estos datos.

¡Gracias!

Intenta declarar un parámetro como myImg de tipo InputStream en tu página de informe. Declare este tipo tanto para param como para marcador de imagen en la página. Luego, toma la imagen de classpath usando algo como (suponiendo que el nombre de la imagen es ‘imgName.ext’ y está en el paquete llamado ‘your.package’)

InputStream imgInputStream = this.getClass().getResourceAsStream("/your/package/imgName.ext"); parameters.put("myImg", imgInputStream);