当前位置: 首页 > 知识库问答 >
问题:

正在加载中包含的资源(图像)。Jar文件或在类路径中

邵劲
2023-03-14

所以我在堆栈交换上尝试了各种读取此问题的各种修复,大多数说使用getResourceAsStream()方法,我已经完成了。这是我的Jar资源输入法。

import java.io.InputStream;

    public class ResourceLoader {
        public static InputStream load(String path){
    InputStream input = ResourceLoader.class.getResourceAsStream(path);
    if(input == null){
        input = ResourceLoader.class.getResourceAsStream("/" + path);
    }
    return input;
    }
}

这将在我的ImageLoader类中使用。

public class ImageLoader {

public BufferedImage load(String path){
    try {
//          return ImageIO.read(getClass().getResource(path));
        return ImageIO.read(ResourceLoader.load(path));
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
    }
}

并使用将图像加载到主程序中

ImageLoader loader = new ImageLoader();
    spriteSheet = loader.load("/spritesheet.png");

现在在eclipse中,游戏运行并加载所有图像非常好。但我想做的是将其导出到Jar,我使用一些教程完成了这一点,并成功地将其导出到包含我使用的图像的资源文件夹中。但是当我尝试运行. jar文件时,cmd行中会弹出此错误。

Exception in thread "Thread-2" java,lang.IllegalArgumentException: input == null
!
    at javax.imageio.ImageIO.read<Image.IO.java:1348>
    at gfx.ImageLoader.load<ImageLoader.java:15>
    at man.Gaim.init(Game.java:100>
    at main.Game.run<Game.java:150>
    at java.lang.Thread.run<Thread.java:722>

所以我收集的是图像文件位置没有被正确读取,或者我以某种方式输入错误,返回null并且没有图像正在加载。当运行. Jar时,面板出现,但没有对其进行任何绘制,并且给出了错误。此程序在eclipse中运行完美,没有错误并且加载了所有图像。

编辑1:Robermann getClass()的解决方案。getClassLoader()。getResourceAsStream(路径))工作正常。唯一的问题是我需要把图像文件放在一个jar文件夹中。例如,我有文件夹:----文件。Jar---图像。png---ImageFolder-----ImageFolder中的更多图片。巴布亚新几内亚

当它们位于这样的位置时,我可以加载所有图像。我的实际问题是当我导出一个。罐子图像也位于里面是否可以只使用位于. jar内部的图像?或者我必须像上面一样将imgaes打包在jar旁边的文件夹中,它可以工作,但我更想寻找一个可运行的罐子。我可以直接传输到她的罐子而不需要它们也需要. jar之外的图像。

共有1个答案

袁羽
2023-03-14

如何加载类路径资源的问题经常出现,对于Java新手来说有点困惑:一些答案建议使用类。getClassLoader()。getResourceAsStream,其他类。getResourceAsStream,尽管它们的语义略有不同:

  1. 类别。getResourceAsStream执行路径转换
  2. 类别。getClassLoader()。getResourceAsStream不转换路径

为了更好地显示差异,我将提出以下测试类,它以4种不同的方式尝试加载相同的资源(图像),根据使用的路径,只有2种工作。Jar内容树是:

班级:

package image;

import java.io.InputStream;

public class ImageLoader {
    public static void main(String[] args ){
        String cmd = null;
        InputStream is = null;
        final String image = "save.png";

        if("test1".equals(args[0])){
            cmd = "ImageLoader.class.getClassLoader().getResourceAsStream(\""+image+"\")";
            is = ImageLoader.class.getClassLoader().getResourceAsStream(image);     //YES, FOUND


        }else if("test2".equals(args[0])){
            cmd = "ImageLoader.class.getResourceAsStream(\""+image+"\")";
            is = ImageLoader.class.getResourceAsStream(image);                      //NOT FOUND

        }else if("test3".equals(args[0])){
            cmd = "ImageLoader.class.getResourceAsStream(\"/"+image+"\")";
            is = ImageLoader.class.getResourceAsStream("/"+image);                  //YES, FOUND

        }else if("test4".equals(args[0])){
            cmd = "ImageLoader.class.getClassLoader().getResourceAsStream(\"/"+image+"\")";
            is = ImageLoader.class.getClassLoader().getResourceAsStream("/"+image); //NOT FOUND

        }else {
            cmd = " ? ";
        }

        System.out.println("With "+cmd+", stream loaded: "+(is != null));
    }
}

运行:

java-cp重新加载程序。jar图像。ImageLoader测试4

希望这门课能帮助理解不同的行为。

 类似资料:
  • 在Quarkus中,要将随机文件包含为类路径资源,我们使用<code>Quarkus.native.resources。包括(https://quarkus.io/guides/writing-native-applications-tips#including-资源)。 如何在文件系统中包含文件?即使用读取的内容。 如果我们使用Jib,我们只需将这些文件放在< code>src/main/jib

  • 问题内容: 是否可以指定一个Java ,其中包含另一个JAR文件中包含的JAR文件? 问题答案: 如果您试图创建一个包含应用程序及其所需库的jar,则有两种方法(我知道)。第一个是One-Jar,它使用特殊的类加载器来允许jar的嵌套。第二个是UberJar(或Shade),它会爆炸包含的库并将所有类放在顶级jar中。 我还应该提到UberJar和Shade分别是Maven1和Maven2的插件。

  • 问题内容: 在我的应用程序中,我以这种方式加载资源: 这给了我: 当我从IDE运行我的应用程序时,但是当我运行应用程序的jar时,这可以很好地工作: 路径变为: 有什么办法解决这个问题? 我将使用“存储库”目录名称来创建此目录: 以相同的方式,我将获得一个文件名(而不是目录),并以这种方式使用它: 问题答案: 听起来你正在尝试使用或类似方法加载资源。不要那样做:不要调用,而是从中调用并读取数据。

  • 我在Eclipse中创建了一个Java项目,并创建了一个带有main方法的简单类。 问题:当我运行程序(没有任何服务器等)时,我收到以下错误: 线程“main”java中出现异常。lang.NoClassDefFoundError:org/apache/commons/codec/DecoderException at autoPEC。main(autoPEC.java:6)由:java引起。la

  • 似乎默认情况下,Quarkus生成的本机映像不包含任何与< code>src/main/resources/中的内容相对应的类路径资源。 从GraalVM医生那里,我有点理解为什么会发生这种情况,但现在我被卡住了。是否有方法配置以将资源包含在本机映像中?

  • 我正在尝试从可执行JAR文件加载图像。 我跟踪了这里的信息,然后是这里的信息。 这是检索图像的函数: 这就是它的名称: 这是一个简单的对象。我也不会得到NullPointerException,除非它被UI屏蔽。 我检查了JAR文件,图像位于: /图片/标识1。巴布亚新几内亚 当前代码在eclipse中以及导出到JAR并在终端中运行时都有效,但在双击JAR时不起作用,在这种情况下,图标是默认的JF