不同包中的类 getResourceAsStream() 资源

Posted

技术标签:

【中文标题】不同包中的类 getResourceAsStream() 资源【英文标题】:Class getResourceAsStream() resource in a different package 【发布时间】: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);

【问题讨论】:

【参考方案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中。

以上是关于不同包中的类 getResourceAsStream() 资源的主要内容,如果未能解决你的问题,请参考以下文章

Java 包(package)

Java 包(package)

Java 包(package)

Java 包(package)

java 加载的不同的jar包中有相同的类名怎么办调用到自己需要的类

java 包