【问题标题】:getClass().getClassLoader().getResourceAsStream() always returns null, resource is in application.jargetClass().getClassLoader().getResourceAsStream() 总是返回null,资源在application.jar中
【发布时间】: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


【解决方案1】:

看起来包含图像的目录没有出现在您的 classpath / jar 文件中。

如果要将目录添加到 jar 文件中,请转到 Project Structure(ctrl+alt+shift+s 快捷键)-> Artifacts 选项卡-> 选择您的 jar -> 单击加号按钮(@987654325 @) 在Output Layout 选项卡上 -> 选择 Directory Content -> 将路径放入图像的目录。

重建你的 jar 并再次运行它。

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

【讨论】:

  • 实际上构建 Application.jar 确实包含图像(我已经检查过)。只是这个jar文件没有搜索资源(可能是classpath丢失了.)。
  • 什么时候调试应用,是按照配置的Jar application调试配置还是Application调试配置运行?
  • 不,它使用Application(或更准确地说是Application / Start)配置。 JAR Application 构建配置未配置。我也想知道为什么它对这个应用程序的作者有用,但它对我不起作用。
  • 如果您通过Application 运行它,您应该手动将此目录添加到类路径中,转到Project Settings -> Modules -> 选择您的模块-> 在Dependencies 选项卡上单击加号 (+) -> Jars or Directories -> 选择图像的目录 -> 选择作为类。
  • 此操作将您的目录添加到类路径中。现在您可以在调试模式下打开控制台选项卡,展开命令行(第一行)并在类路径中查看您的目录。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-12
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多