我已经在Stack Overflow上探讨了与此问题相关的每个解决方案,我遇到的解决方案只在我的IDE(Eclipse Mars)中工作,但是在导出时它们都失败了。
我有一个图像文件,我只想从导出的jar中加载。
从项目布局中可以看出,Images
是项目文件夹CooldownTrackerJava
内部的文件夹。为了引用它,我尝试了各种方法。
//My class' name is AddItemDialog
//Method 1
String filePath = File.separator + "Images" + File.separator + "questionMark.png";
InputStream inputStream = AddItemDialog.class.getResourceAsStream(filePath);
BufferedImage img = ImageIO.read(inputStream);
我在几个方面尝试了方法1。我在filePath的开头使用和不使用File.separator
尝试了它。 我知道前者指的是绝对路径,而后者是相对的。我也尝试将Images文件夹移动到我的类文件所在的目录中。
多次导出和测试时,所有这些都失败了NullPointerException
。
//Method 2
String saveLocation = File.separator + "Images" + File.separator + "questionMark.png";
Image img = Toolkit.getDefaultToolkit().getImage(getClass().getResource(saveLocation));
As per this post我尝试了上述方法,但仍然无效。
除了本文中提到的那些之外,我尝试了许多变化,但是当我导出jar时,它们都没有成功。
我是否需要将Images文件夹添加到构建路径?我应该将它移到src
文件夹吗?我错过了一个明显的步骤吗?所有建议都将受到高度赞赏。这里还有导出的jar文件的布局。
答案 0 :(得分:2)
解决方案分为两部分。首先,我将Images
文件夹移动到src
目录中,如下所示。感谢马修。
然后我删除了File.separator
并将其替换为正斜杠/
。感谢fge。
不要使用File.separator()。类路径上资源路径的分隔符始终为/。如果你使用Windows,你将总是得到错误的结果。
我使用了方法1的变体来测试它。这两种方法都可行。
String saveLocation = "/Images/questionMark.png";
InputStream inputStream = this.getClass().getResourceAsStream(saveLocation);
try {
BufferedImage img = ImageIO.read(inputStream);
} catch (IOException e) {
e.printStackTrace();
}