Java getClass().getClassLoader().getResourceAsStream()始终返回null,资源位于application.jar中

Java getClass().getClassLoader().getResourceAsStream()始终返回null,资源位于application.jar中,java,intellij-idea,jar,resources,classpath,Java,Intellij Idea,Jar,Resources,Classpath,我正在尝试用Java构建和运行一个桌面应用程序。它尝试加载一个图像作为JPanel的背景 final ClassLoader ClassLoader=getClass().getClassLoader(); final InputStream BackgroundImageStream=getClass().getClassLoader().getResourceAsStream(“back.jpg”); if(backgroundimagestream!=null){ final Image

我正在尝试用Java构建和运行一个桌面应用程序。它尝试加载一个图像作为JPanel的背景

final ClassLoader ClassLoader=getClass().getClassLoader();
final InputStream BackgroundImageStream=getClass().getClassLoader().getResourceAsStream(“back.jpg”);
if(backgroundimagestream!=null){
final Image backgroundImage=javax.imageio.imageio.read(backgroundimagestream);
// ...
}否则{
System.out.println(“'back.jpg'未找到资源”);
}
我正在使用IntelliJ IDEA作为我的IDE

“back.jpg”文件存储在项目的'resources/'子目录中(或者更确切地说是“src/main/resources”)。此目录已正确标记为资源目录,'.*.jpg'文件在允许的文件中(Resource Patterns选项仅包含负面模式-在开头添加显式
?*.jpg
模式没有帮助)

我已经检查了JAR文件,Application.JAR在归档文件的主目录中有'back.jpg',因此构建系统正确地将其添加到JAR文件中

我尝试过的以下组合都不起作用:

  • getClass().getClassLoader().getResourceAsStream(“back.jpg”)
  • getClass().getClassLoader().getResourceAsStream(“resources/back.jpg”)
  • getClass().getClassLoader().getResourceAsStream(“/src/main/resources/back.jpg”)
  • getClass().getResourceAsStream(“back.jpg”)
  • getClass().getResourceAsStream(“resources/back.jpg”)
  • getClass().getResourceAsStream(“/src/main/resources/back.jpg”)
在尝试调试它时,我注意到,在尝试查找资源时,Java没有在列表中包含
Application.jar
。如何在IntelliJ IDEA中改变它

到目前为止,我已经读了很多关于这个话题的问题,但没有一个能解决我的问题


应用程序的IML文件包括以下行:



解决方案:(遵循注释中的路径)

应用程序是使用
应用程序
(或者更准确地说是
应用程序/启动
)配置生成的,可以在运行/调试配置窗口中进行检查(使用生成选择按钮的编辑配置打开)


如果通过
应用程序运行它
,则需要手动将
资源
目录添加到类路径中。转到项目设置->模块->选择您的模块,在依赖项选项卡上单击加号(+)->JAR或目录->选择图像的目录->选择为类

这将向IML文件中添加以下行


看起来包含图像的目录没有出现在您的
类路径中

如果要将目录添加到jar文件中,请转到
项目结构(ctrl+alt+shift+s快捷方式)->
工件
选项卡->选择jar->单击
输出布局
选项卡->选择
目录内容
->将路径放入图像的目录

重新构建jar并再次运行它


现在,您的jar应该包含图像。

尝试
Thread.currentThread().getContextClassLoader().getResourceAsStream(“back.jpg”)
。你是从Intellij运行的吗?@Quasimodoon:谢谢你的建议,但它也不起作用。是的,我是从IntelliJ运行它的。实际上build Application.jar确实包含这个映像(我已经检查过了)。只是没有搜索此jar文件的资源(可能缺少类路径)。在调试应用程序时,您是按配置的jar应用程序调试配置还是按配置的jar应用程序调试配置运行?不,它使用的是
application
(或者更准确地说
应用程序/启动
)配置。
JAR应用程序
构建配置未配置。我也想知道为什么它对这个应用程序的作者有效,但对我无效。如果你通过
应用程序运行它
,你应该手动将这个目录添加到类路径中,请转到
项目设置
模块
->选择你的模块->在
依赖项
选项卡上,单击加号(+)->
JAR或目录
->选择映像的目录->选择为类。此操作将目录添加到类路径中。现在,您可以在调试模式下打开控制台选项卡,展开命令行(第一行)并在类路径中查看目录。