如果设置为任何目录,我可以从类路径加载资源吗?

时间:2011-04-26 21:03:16

标签: java

我想用这个加载资源:

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吗?

谢谢

1 个答案:

答案 0 :(得分:3)

使用getResourceAsStream时要注意的一件事是您要检索的资源名称的格式。默认情况下,如果未指定路径,例如“autopublisherpath.cfg”,则类加载器将期望指定的资源与执行getResourcesAsStream方法的类位于同一个包中。可以在getResourceAsStream的JVM文档中找到此行为的原因:

  • 如果名称以'/'('\ u002f')开头,则资源的绝对名称是'/'后面的名称部分。
  • 否则,绝对名称的格式如下: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(...)从任何类实例执行相同的功能。