java - 在不同的包中类 getResourceAsStream() 资源

标签 java eclipse classloader

我有类似下面的项目结构

-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);

最佳答案

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

The name of a resource is a '/'-separated path name that identifies the resource.

我最初发布的代码片段会起作用

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说的更多。

Where the modified_package_name is the package name of this object with '/' substituted for '.' ('\u002e').

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

article给出的是对这种情况的一个很好的解释。

关于java - 在不同的包中类 getResourceAsStream() 资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16320170/

相关文章:

Java正确加载属性文件

java - 在我重新启动手机之前,图像不会显示在照片应用程序中

Java:Bug:JFileChooser 仅有时出现

java - Java 中的顶级类是什么?

eclipse - 使用 Eclipse EGit 在 1and1 共​​享 Linux 服务器中克隆 1and1 git 存储库时出现问题

java.lang.NoSuchMethodError : org. jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object - Tomcat 8

java - JNI传递参数给c++的方法

java - 如何从现有工作台窗口打开新的工作台窗口(带有其自己的 WorkbenchWindowAdvisor)?

eclipse - 从 pom.xml 设置事件 Spring 配置文件并与 IDE 集成

java - 在 Karaf OSGI 中,我收到抛出异常的包中的类的 ClassNotFoundException