【发布时间】:2021-01-09 11:38:56
【问题描述】:
我正在尝试用 Java 构建和运行桌面应用程序。它会尝试加载图像以用作 JPanel 的背景。
final ClassLoader classLoader = getClass().getClassLoader();
final InputStream backgroudImageStream = getClass().getClassLoader().getResourceAsStream("back.jpg");
if (backgroudImageStream != null) {
final Image backgroundImage = javax.imageio.ImageIO.read(backgroudImageStream);
// ...
} else {
System.out.println("'back.jpg' resource not found");
}
我使用 IntelliJ IDEA 作为我的 IDE。
'back.jpg' 文件存储在项目的 'resources/' 子目录中(或者更准确地说是 'src/main/resources')。此目录已正确标记为资源目录,“*.jpg”文件属于允许文件(资源模式选项仅包含负面模式 - 在开头添加显式 ?*.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 文件包括以下几行:
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
解决方案:(按照 cmets 中的路径到Svirin's answer)
应用程序是使用Application(或更准确地说是Application / Start)配置构建的,可以在运行/调试配置窗口中检查(使用编辑配置 构建选择按钮)。
如果您通过Application 运行它,您需要手动将resources 目录添加到类路径中。转到 Project Settings -> Modules -> 选择您的模块,在 Dependencies 选项卡上单击加号 (+) -> Jars or Directories -> 选择图像的目录 -> 选择为类。
这会将以下行添加到 IML 文件中
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="file://$MODULE_DIR$/src/main/resources" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
【问题讨论】:
-
试试
Thread.currentThread().getContextClassLoader().getResourceAsStream("back.jpg")。你是从 Intellij 运行它吗? -
@quasimodo00 :感谢您的建议,但也没有用。是的,我从 IntelliJ 运行它。
标签: java intellij-idea jar resources classpath