【问题标题】:Class getResourceAsStream() resource in a different package不同包中的类 getResourceAsStream() 资源
【发布时间】:2013-04-25 13:41:15
【问题描述】:

我有类似下面的项目结构

-project 
    -src/main/java // source folder
        -com.mypackage
            -Utility.java
            -some.properties
    -src/main/resources // source folder
        -configuration_files
            -configuration_report.txt

我正在使用 Eclipse 的 Export 函数生成 jar。以上转换为jar,结构如下:

-myjar.jar
    -com
        -mypackage
            -Utility.class
            -some.properties
    -configuration_files
        -configuration_report.txt

Utility 类中,我试图从configuration_report.txt 获取InputStream

我正在这样做(它在 static 方法中):

Utility.class.getResourceAsStream("/configuration_files/configuration_report.txt"); 

这似乎得到了this question 的答案的验证,因为该文件与请求它的类不在同一个包中。

但是,当我运行它时,它会返回 null。为什么?

请注意,对于 some.properties 文件,我可以同时做这两件事

Utility.class.getResourceAsStream("/com/package/some.properties");
Utility.class.getResourceAsStream("some.properties");

我会得到流。

如果有什么不同,我会从命令行运行它。

java [-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=1044] -cp myjar.jar MyMain

如果我尝试在 Eclipse 中运行它,它可以工作...

编辑:

此代码是相关的。不管有没有前面的/,它都返回null

    String sourceFilePath = "/configuration_files" + File.separator + "configuration_report.txt";
    InputStream in = Utility.class.getResourceAsStream(sourceFilePath);

【问题讨论】:

    标签: java eclipse classloader


    【解决方案1】:

    经过多次尝试,解决方案归结为ClassLoader#getResource(String) 的这个小的 javadoc 条目:

    资源的名称是一个以“/”分隔的路径名,用于标识该资源。

    我最初发布的 sn-p 会起作用的

    Utility.class.getResourceAsStream("/configuration_files/configuration_report.txt"); 
    

    但我没有使用/,我使用的是File.separator,就像在我的编辑中一样:

    String sourceFilePath = "/configuration_files" + File.separator + "configuration_report.txt";
    

    认为类加载器像操作系统特定的文件操作一样工作。第一个/ 匹配,但File.separator 评估为\\,因为我在Windows 上。

    Class#getResource(String) 的 javadoc 有更多相同的内容。

    modified_pa​​ckage_name 是这个对象的包名,用 '/' 代替了 '.' ('\u002e')。

    至于为什么这在 Eclipse 上有效,而不是从命令行,我仍然不确定,但请看下面@andy 的评论。

    article 给出的这个很好地解释了这种情况。

    【讨论】:

    • 我尝试使用 '\\',将 jar 提取到文件夹并运行 java -cp 。主要它可以工作,但不能在 jar 中工作。我认为'\\'在文件夹中有效,因为类加载器可以在真实文件夹中找到路径“configuration_files\\configuration_report.txt”,但不能在jar中。
    猜你喜欢
    • 1970-01-01
    • 2017-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 2017-01-18
    • 1970-01-01
    相关资源
    最近更新 更多