configurar archivos java jar

archivos - configurar classpath java



Cargando recursos(imágenes) contenidos en un archivo.Jar o en el classpath (1)

La cuestión de cómo cargar los recursos classpath es bastante recurrente y un poco confusa para un principiante de Java: algunas respuestas sugieren class.getClassLoader().getResourceAsStream , others class.getResourceAsStream , aunque tienen una semántica ligeramente diferente:

  1. class.getResourceAsStream realiza una traducción de ruta
  2. class.getClassLoader (). getResourceAsStream no traduce la ruta

Para mostrar mejor la diferencia, voy a proponer la siguiente clase de prueba, que de 4 maneras diferentes intenta cargar el mismo recurso (una imagen), solo 2 trabajando en función de la ruta utilizada. El árbol de contenido Jar es:

La clase:

package image; import java.io.InputStream; public class ImageLoader { public static void main(String[] args ){ String cmd = null; InputStream is = null; final String image = "save.png"; if("test1".equals(args[0])){ cmd = "ImageLoader.class.getClassLoader().getResourceAsStream(/""+image+"/")"; is = ImageLoader.class.getClassLoader().getResourceAsStream(image); //YES, FOUND }else if("test2".equals(args[0])){ cmd = "ImageLoader.class.getResourceAsStream(/""+image+"/")"; is = ImageLoader.class.getResourceAsStream(image); //NOT FOUND }else if("test3".equals(args[0])){ cmd = "ImageLoader.class.getResourceAsStream(/"/"+image+"/")"; is = ImageLoader.class.getResourceAsStream("/"+image); //YES, FOUND }else if("test4".equals(args[0])){ cmd = "ImageLoader.class.getClassLoader().getResourceAsStream(/"/"+image+"/")"; is = ImageLoader.class.getClassLoader().getResourceAsStream("/"+image); //NOT FOUND }else { cmd = " ? "; } System.out.println("With "+cmd+", stream loaded: "+(is != null)); } }

Corre con:

java -cp resLoader.jar image.ImageLoader test4

Espero que esta clase pueda ayudar a entender el comportamiento diferente.

Así que he intentado varias lecturas de varias correcciones para este problema en el intercambio de stack, la mayoría dicen que use el método getResourceAsStream() , lo cual he hecho. Este es mi método de entrada de recursos para el Jar.

import java.io.InputStream; public class ResourceLoader { public static InputStream load(String path){ InputStream input = ResourceLoader.class.getResourceAsStream(path); if(input == null){ input = ResourceLoader.class.getResourceAsStream("/" + path); } return input; } }

Esto luego se usa en mi clase de ImageLoader .

public class ImageLoader { public BufferedImage load(String path){ try { // return ImageIO.read(getClass().getResource(path)); return ImageIO.read(ResourceLoader.load(path)); } catch (IOException e) { e.printStackTrace(); } return null; } }

y las imágenes se cargan en el programa principal utilizando

ImageLoader loader = new ImageLoader(); spriteSheet = loader.load("/spritesheet.png");

Ahora en eclipse el juego corre y carga todas las imágenes perfectamente bien. Pero lo que quiero hacer es exportarlo a Jar, lo cual he hecho usando algunos tutoriales y he tenido éxito en exportarlo con la carpeta de recursos que contiene mis imágenes que se usan. Pero cuando intento ejecutar el archivo .jar, este error aparece en la línea de cmd.

Exception in thread "Thread-2" java,lang.IllegalArgumentException: input == null ! at javax.imageio.ImageIO.read<Image.IO.java:1348> at gfx.ImageLoader.load<ImageLoader.java:15> at man.Gaim.init(Game.java:100> at main.Game.run<Game.java:150> at java.lang.Thread.run<Thread.java:722>

Entonces, lo que estoy recopilando es que las ubicaciones de los archivos de imagen no se están leyendo correctamente o de alguna manera las he replicado incorrectamente, lo que está devolviendo nulo y ninguna de las imágenes se está cargando. Cuando se ejecuta .Jar, aparece el Panel, pero no hay nada pintado y se da ese error. Este programa funciona perfectamente en eclipse sin errores y cargando todas las imágenes.

EDIT 1: Robermann funciona su solución para getClass (). GetClassLoader (). GetResourceAsStream (ruta)). Lo único es que necesito tener los archivos de imagen en una carpeta con el frasco. Por ejemplo, tengo Folder: --- File.Jar --- Images.png --- ImageFolder ------- Más imgaes en imagefolder.png

Puedo cargar todas las imágenes cuando están ubicadas así. Mi verdadera pregunta fue cuando exporté un archivo .Jar. Las imágenes también se encuentran dentro ¿es posible usar las imágenes que se encuentran dentro del .jar? O tengo que empacar los imgaes en una carpeta al lado del frasco como arriba, funciona pero yo estaba buscando más un ejecutable .Jar que podría simplemente transer tohers sin tenerlos también necesitar las imágenes fuera del .jar.