【问题标题】:Why is this classpath resource null?为什么这个类路径资源为空?
【发布时间】:2011-06-17 12:46:12
【问题描述】:

我有一个结构如下的 Maven 项目:

  • src/main/java/test/App.java
  • src/main/resources/config/message.txt

在 App.java 里面,我有这行:

InputStream is = Thread.currentThread()
    .getContextClassLoader()
    .getResourceAsStream("/config/message.txt");

我已经尝试了各种获取资源的变体,我可以在 Stackoverflow 和 Google 上找到,但是当我运行 mvn exec:java -Dexec.mainClass=test.App 时,它似乎总是返回 null。我在这里错过了什么?

【问题讨论】:

  • 您是否验证了 message.txt实际上在构建的罐子中?您能否将jar 工具列表的输出转储到您的问题的编辑中?我认为有些人对 Jar 的确切结构感到困惑。我确定。

标签: java maven


【解决方案1】:

试试:

InputStream is = test.App.class.getResourceAsStream("/config/message.txt");

或者简单地说:

InputStream is = getClass().getResourceAsStream("/config/message.txt");

【讨论】:

  • 这就是为什么我在路径前面加上/。否则 test.App.class.getResourceAsStream() 将在 /test/config/message.txt 中查找(从 current 类目录开始)。
  • @PeterMmm:不是它不在“同一目录”中,而是前面的/ 表示从“根”解析此URL。在这种情况下,它将是类路径的根。
【解决方案2】:

你可以试试这个:

InputStream is = this.getClass().getResourceAsStream("/config/message.txt");

【讨论】:

    【解决方案3】:

    我的赌注:

    InputStream is = App.class.
        getResourceAsStream("../../resources/config/message.txt");
    

    我不明白你想在这里用 currentThread() 做什么。

    【讨论】:

    • ../../res... - 只有在 App.java 包含在 java.test 包中时才会正确(我认为这是“非法的”)。相对路径应该是../res...
    猜你喜欢
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2017-08-30
    • 2010-11-17
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多