我想用这个加载资源:
InputStream iStream = Config.class.getResourceAsStream("autopublisherpath.cfg");
所以我设置了 CLASSPATH 使其工作。这是我的目录层次结构:
- autopublisher
.classes
.lib
.resources
如果我将 %AUTOPUBLISHER_HOME%\resources\config 添加到我的类路径中,我将无法获取资源。否则,如果我将 .cfg 文件放入类中并添加 %AUTOPUBLISHER_HOME%\classes ,资源就会正确加载。类目录不包含除 autopublisherpath.cfg 之外的任何内容。
最终我想打电话:
java com.test.Something
正在加载资源的位置。问题是我希望用户修改此配置文件,因此我不将其包含在我的 jar 包装中。
我没有正确理解 CLASSPATH 吗?
谢谢
最佳答案
使用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(...)
从任何类实例执行相同的功能。
关于java - 如果设置为任何目录,我可以从类路径加载资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5796416/