Java 从jar文件加载图像

Java 从jar文件加载图像,java,Java,我有一个应用程序可以从Netbeans IDE完美地工作,但是当从dist目录中的jar文件运行时,不会加载必要的映像 我花了1 1/2天的时间阅读这个论坛和其他论坛,试图找到答案,但我无法让jar图像正常工作 这是我代码的摘录: String str = t.getText() + "100.gif"; Image img = null; if (t != HIDDEN) { ClassLoader cldr = Terrain.class.getClassLoader();

我有一个应用程序可以从Netbeans IDE完美地工作,但是当从dist目录中的jar文件运行时,不会加载必要的映像

我花了1 1/2天的时间阅读这个论坛和其他论坛,试图找到答案,但我无法让jar图像正常工作

这是我代码的摘录:

String str = t.getText() + "100.gif";
Image img = null;

if (t != HIDDEN)
{
    ClassLoader cldr = Terrain.class.getClassLoader();
    URL url = cldr.getResource("fantasyhexwar/Images/" + str);

    if (url == null)
        JOptionPane.showMessageDialog(null, "no good");

    img = ImageIO.read(url);
    t.setImage(img);
}
我尝试了许多相对路径的组合,包括“images/”、“/images/”等。这些图像位于jar文件中:

 fantasyhexwar/Images/plains100.gif
 fantasyhexwar/Images/quarry60.gif
 fantasyhexwar/Images/ram80.gif
 fantasyhexwar/Images/save map40.gif
 fantasyhexwar/Images/scout80.gif
 fantasyhexwar/Images/settler80.gif
 fantasyhexwar/Images/ship80.gif
等等

我知道我遗漏了一些基本的东西,但我不确定是什么。我怀疑这与清单文件或类路径有关

希望有人能给我指出正确的方向

编辑: 问题似乎是

URL url = Terrain.class.getResource("/fantasyhexwar/Images/" + str);
返回null。图像肯定在JAR中,在绝望中,我还尝试了所有可能的相对路径,代码如下:

ClassLoader cldr = Terrain.class.getClassLoader();
URL url = Terrain.class.getResource("/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("/fantasyhexwar/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("fantasyhexwar/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("/fantasyhexwar/Images/" + str);
if (url == null)
    url = cldr.getResource("/Images/" + str);
if (url == null)
    url = cldr.getResource("Images/" + str);
if (url == null)
    url = cldr.getResource("/" + str);
if (url == null)
    url = cldr.getResource(str);
if (url == null)
    JOptionPane.showMessageDialog(null, "no good");
但是当直接从JAR执行时,这些都不起作用

当我尝试从命令行运行时,我得到:

java-cp。;FantasyHexWar.jar FantasyHexWarApp


也许值得一试


Image theImage = getToolkit().getImage(getClass().getResource("/path/to/image"))

阅读Swing教程中关于如何工作的详细说明。

我认为这与从jar加载图像无关。例外情况是:-

java.lang.ClassLoader.loadClass(Unknown Source) Could not find the main class: FantasyHexWarApp. Program will exit.

这意味着,
FantasyExwarApp
main类在jar中丢失。解决这个问题,它应该可以正常工作。:)

我对文件名有点粗心。例如,一个文件名为“save map.png”,但应用程序正在查找“save map.png”

这在从驱动器加载文件时效果很好,但当转换为URL并直接从jar加载时,效果就完全不同了


因此,jar中的资源文件名似乎区分大小写

ClassLoader.getSystemResource("images/Springz3.png");

如果图像在jar文件中,则在FantasyExwar/images/*下


我也有同样的问题。在阅读关于getToolkit()函数的意见时,我想到了解决方法。在我的例子中,我正在构建一个桌面应用程序,函数getToolkit()对我来说不可用。相反,我需要使用以下代码:

Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(path));

该程序现在在Netbeans环境内外运行。

FantasyExwar是您的jar名称??代码和图像是在单独的jar文件中,还是在同一个jar文件中?您是否检查了JAR文件以确保包含您的资源?它是否可以从命令行工作,但没有JAR?代码和图像位于同一JAR文件中。是的,我已经检查了图像是否包含在内。我无法从命令行让它工作,因此我推测可能是类路径问题。问题是getResource(“/FantasyExwar/images/”+str”)返回空URL,即使gif在java文档中,它说getResource()如果找不到具有此名称的资源,则返回
URL对象或null
。我猜可能是路径错误或文件不在其中。您能否提取jar并仔细检查路径以及文件是否确实在其中?只需提取它们就行了,并且图像如预期的那样位于FantasyExwar/images目录中。它可能是一个i吗有没有安全策略不允许访问JAR中的图像?问题是我可以很容易地让它与JAR外的图像一起工作,所以我可能不得不这样分发它。我只是希望我知道问题出在哪里…这是可能的,但我仍然倾向于它,因为某种原因无法找到它们。你尝试过co吗de I posted以获取资源?它是否引发异常或为您提供了空映像?我是从静态方法调用它的,因此我必须将其修改为Terrain.class.getResource(“/path/to/image”)。明天我将尝试将代码转移到另一个位置作为测试。我还想知道调用它是否太早了-Terrain.loadTerrainImages();Building.loadBuildingImages();TroopType.loadTroopImages();都是在视图构造函数中的组件初始化后调用的。但是,如果图像不在JAR中,这不是问题。@Mark Keen,本教程是关于加载图标的。它展示了如何构造JAR文件以包含类和图像文件。在这些示例中,没有一个是以“FantasyExwar”开头的“。所有示例都将URL显示为以您的目录名开头。本教程还展示了如何从命令行指定类路径。谢谢,这实际上是一个有用的页面。今天早些时候我也在看一本书。问题是,在我的例子中,getClass().getResource(path);返回一个空URL,即使我确信路径是正确的,并且图像在JAR中。我甚至尝试使用给定的命令从命令行运行它。我只能想,也许我的JAR中的清单信息设置不正确——它目前也是由Netneans IDE生成的……是的,但不是。事实上,如果我禁用加载图像,它会起作用(
Image image = getToolkit().getImage(ClassLoader.getSystemResource("fantasyhexwar/Images/plains100.gif"));
Toolkit.getDefaultToolkit().getImage(ClassLoader.getSystemResource(path));