不同包中的类 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_package_name 是这个对象的包名,用 '/' 代替了 '.' ('\u002e')。
至于为什么这在 Eclipse 上有效,而不是从命令行,我仍然不确定,但请看下面@andy 的评论。
article 给出的这个很好地解释了这种情况。
【讨论】:
我尝试使用 '\\',将 jar 提取到文件夹并运行 java -cp 。主要它可以工作,但不能在 jar 中工作。我认为'\\'在文件夹中有效,因为类加载器可以在真实文件夹中找到路径“configuration_files\\configuration_report.txt”,但不能在jar中。以上是关于不同包中的类 getResourceAsStream() 资源的主要内容,如果未能解决你的问题,请参考以下文章