我想用这个加载资源:
InputStream iStream = Config.class.getResourceAsStream("autopublisherpath.cfg");
所以我设置CLASSPATH使它工作。这是我的目录层次结构:
- autopublisher
.classes
.lib
.resources
如果我将%AUTOPUBLISHER_HOME%\ resources \ config 添加到我的类路径中,我无法获取资源。否则,如果我将.cfg文件放在类中并添加%AUTOPUBLISHER_HOME%\ classes ,则会正确加载资源。类dir不包含autopublisherpath.cfg以外的任何内容。
最终我想打电话:
java com.test.Something
哪些东西正在加载资源。问题是我希望用户修改此配置文件,因此我不会将其包含在我的jar包装中。
我没有正确理解CLASSPATH吗?
谢谢
答案 0 :(得分:3)
使用getResourceAsStream
时要注意的一件事是您要检索的资源名称的格式。默认情况下,如果未指定路径,例如“autopublisherpath.cfg”,则类加载器将期望指定的资源与执行getResourcesAsStream
方法的类位于同一个包中。可以在getResourceAsStream的JVM文档中找到此行为的原因:
modified_package_name/name
在您的特定示例中,如果Config
类位于com.test.config包中,则“autopublisherpath.cfg”的资源名称将转换为“/ com / test / config / autopublisherpath” .cfg“(包中的句点替换为'/'字符)。因此,与原始项目层次结构保持一致,您需要将文件放在以下位置:
autopublisher/resources/config/com/test/config
其中autopublisher/resources/config
是作为应用程序执行类路径的一部分添加的。
如果您要将特定的配置目录添加到类路径并希望该文件位于该目录的根目录中,则需要在文件名前加上“/”字符,该字符指定资源应该在类路径的根包中。
InputStream iStream = Config.class.getResourceAsStream("/autopublisherpath.cfg");
使用此代码,您应该能够将resource/config
目录添加到类路径并按预期读取文件。
另外,getResourceAsStream
方法使用从中执行它的类的类加载器(在本例中为Config)加载资源。除非您的应用程序使用多个类加载器,否则您可以使用this.getClass().getResourceAsStream(...)
从任何类实例执行相同的功能。