在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/picfoldersrc/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