在jar包中定位资源
我有一个静态类,在类中,图像被加载到BufferedImage对象中,如下所示:
File groundTopImageFile = new File("src/main/resources/ground - grass top.png");
现在,当我使用Maven2创建一个可执行jar时,一切正常,除了它找不到图像文件。 我检查了jar,图像文件都放在jar的根目录中,所以我尝试使用:
File groundTopImageFile = new File("ground - grass top.png");
但没有成功。 同样,我不能再在Eclipse中使用相同的代码了。 有没有办法在jar和Eclipse中使这个工作?
这是我的Pom.xml文件:
4.0.0 com.WetWindmill Sheepness Sheepness 0.0.1-SNAPSHOT Equilibrium reaction visualized with sheep :) junit junit 4.4 test org.slf4j slf4j-log4j12 1.5.8 org.apache.maven.plugins maven-compiler-plugin 1.6 1.6 org.apache.maven.plugins maven-dependency-plugin unpack-dependencies generate-resources unpack-dependencies org.apache.maven.plugins maven-jar-plugin controller.Sheepness com.WetWindmill.Sheepness under development www.WetWindmill.com/Projects/Sheepness/ ${basedir}/target/dependency ${basedir}/src/main/resources
使用ImageIO.read(inputStream)并使用ClassLoader.getResourceAsStream()
读取InputStream
。
示例代码:
String resourceName = "my/picfolder/mypic.jpg"; ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream stream = classLoader.getResourceAsStream(resourceName); BufferedImage bi = ImageIO.read(stream);
注意:
在我的代码示例中, my/picfolder
是src/main/resources
下面的相对文件夹层次结构。
URL imgURL = getClass().getResource("/ground - grass top.png"); if (imgURL != null) { return new ImageIcon(imgURL, "Ground Grass Top"); } else { logger.error("Couldn't find file: " + "ground - grass top.png"); return null; }
使用类加载器getResourceAsStream()方法。
不要使用“/./resources/back_img.png”,而是在ClassLoader中使用“resources / back_img.png”。 这是一个例子:
String path = "resources/back_img.png"; ClassLoader cl = ImageHandler.class.getClassLoader(); URL imgURL = cl.getResource(path); //URL imgURL = ImageHandler.class.getResource(path); if (imgURL != null) { ImageIcon icon = new ImageIcon(imgURL, description); Image img = icon.getImage(); Image sizedImg = img.getScaledInstance(width, height, Image.SCALE_DEFAULT); return new ImageIcon(sizedImg); } else { System.err.println("Couldn't find file: " + path); return null; }
你解决了我的问题,肖恩帕特里克弗洛伊德。 谢谢IDE之间似乎有所不同,但是,看到jar文件的结构,我们知道相对路径是什么。 就我而言,我使用Netbean,我的文件放在src / my / picfolder / mypic.jpg (这是src / main / resources / my / picfolder / mypic.jpg和Sean),但是在构建时,提取jar文件我们我会在my / picfolder / mypic.jpg中看到图片。 因此,当我们调用getResourceAsStream时,相对路径必须是my / picfolder / mypic.jpg