图像在导出的 JAR 中加载,但在 运行 来自 eclipse 时不加载
Images loading in exported JAR, but not when running from eclipse
我看到很多人对在 Eclipse 中 运行 时加载的图像有同样的问题,但在从导出的 JAR 运行 时却没有。在找到正确的解决方法之前,我一直遇到这个问题。现在我遇到了一个问题,当 运行 从新导出的可运行 JAR 中加载图像并且程序运行完美时,但在 Eclipse 中却不行!值得注意的是,我事先在我的机器上更新了 Java!
这是我的项目的屏幕截图:
在 Eclipse 中 运行 非常好,直到我弄清楚如何正确导出可运行的 JAR 而现在它没有!将 Assets 文件夹设为源文件夹,在第 19 行看到的图像 class 使用以下代码:
public Image(String path)
{
try {
image = ImageIO.read(getClass().getResourceAsStream(path));
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
w = image.getWidth();
h = image.getHeight();
// Reads all the pixel data into a 1D array
p = image.getRGB(0, 0, w, h, null, 0, w);
}
在屏幕截图中可以看到完整的错误,但例外情况是:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1356)
at rawGE/com.albionbrown.rawge.gfx.Image.<init>(Image.java:20)
at coalDrop/com.albionbrown.ld48.MenuSprite.<init>(MenuSprite.java:19)
at coalDrop/com.albionbrown.ld48.Game.<init>(Game.java:44)
at coalDrop/com.albionbrown.ld48.Game.main(Game.java:32)
折腾了半天,终于发现问题所在了。
在我导出的 JAR(我随后导入到我的游戏项目中的一个小游戏库)中,我有一个 class 用于加载使用
的图像
getClass().getResourceAsStream(path)
给定 path
是真实图像的字符串。当 运行ning test classes 实际上在我的游戏库项目中时,这工作正常,因为我猜 getResourceAsStream() 使用 localised root 作为游戏库的根项目。
因此,我的解决方法是为图像加载创建两个构造函数 class(在游戏库中)。仍然接受文件路径字符串并使用 getClass().getResourceAsStream(path) 的一个,如下所示:
public Image(String path)
{
loadImageResource(getClass().getResourceAsStream(path));
}
private void loadImageResource(InputStream path)
{
try {
image = ImageIO.read(path);
}
catch (IOException e) {
e.printStackTrace();
}
}
另一个用于将游戏库用作导出 JAR 的项目,它接受 InputStream 对象。这意味着调用 Image 构造函数的方法将需要 运行 getClass().getResourceAsStream(path) 本身(我想然后使用该项目作为根,而不是导出的 JAR 的根)。像这样:
public Image(InputStream path)
{
loadImageResource(path);
}
private void loadImageResource(InputStream path)
{
try {
image = ImageIO.read(path);
}
catch (IOException e) {
e.printStackTrace();
}
}
我看到很多人对在 Eclipse 中 运行 时加载的图像有同样的问题,但在从导出的 JAR 运行 时却没有。在找到正确的解决方法之前,我一直遇到这个问题。现在我遇到了一个问题,当 运行 从新导出的可运行 JAR 中加载图像并且程序运行完美时,但在 Eclipse 中却不行!值得注意的是,我事先在我的机器上更新了 Java!
这是我的项目的屏幕截图:
在 Eclipse 中 运行 非常好,直到我弄清楚如何正确导出可运行的 JAR 而现在它没有!将 Assets 文件夹设为源文件夹,在第 19 行看到的图像 class 使用以下代码:
public Image(String path)
{
try {
image = ImageIO.read(getClass().getResourceAsStream(path));
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
w = image.getWidth();
h = image.getHeight();
// Reads all the pixel data into a 1D array
p = image.getRGB(0, 0, w, h, null, 0, w);
}
在屏幕截图中可以看到完整的错误,但例外情况是:
Exception in thread "main" java.lang.IllegalArgumentException: input == null!
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1356)
at rawGE/com.albionbrown.rawge.gfx.Image.<init>(Image.java:20)
at coalDrop/com.albionbrown.ld48.MenuSprite.<init>(MenuSprite.java:19)
at coalDrop/com.albionbrown.ld48.Game.<init>(Game.java:44)
at coalDrop/com.albionbrown.ld48.Game.main(Game.java:32)
折腾了半天,终于发现问题所在了。
在我导出的 JAR(我随后导入到我的游戏项目中的一个小游戏库)中,我有一个 class 用于加载使用
的图像getClass().getResourceAsStream(path)
给定 path
是真实图像的字符串。当 运行ning test classes 实际上在我的游戏库项目中时,这工作正常,因为我猜 getResourceAsStream() 使用 localised root 作为游戏库的根项目。
因此,我的解决方法是为图像加载创建两个构造函数 class(在游戏库中)。仍然接受文件路径字符串并使用 getClass().getResourceAsStream(path) 的一个,如下所示:
public Image(String path)
{
loadImageResource(getClass().getResourceAsStream(path));
}
private void loadImageResource(InputStream path)
{
try {
image = ImageIO.read(path);
}
catch (IOException e) {
e.printStackTrace();
}
}
另一个用于将游戏库用作导出 JAR 的项目,它接受 InputStream 对象。这意味着调用 Image 构造函数的方法将需要 运行 getClass().getResourceAsStream(path) 本身(我想然后使用该项目作为根,而不是导出的 JAR 的根)。像这样:
public Image(InputStream path)
{
loadImageResource(path);
}
private void loadImageResource(InputStream path)
{
try {
image = ImageIO.read(path);
}
catch (IOException e) {
e.printStackTrace();
}
}