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

标签 java

我想用这个加载资源:

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_pa​​ckage_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/

相关文章:

java - 如何在 JBoss "Wildfly"中的 2 个 EAR 之间共享 JPA 数据模型

java - 如何实现图形到JScrollPane?

java - 从java项目中提取所有字符串

java - 如何让模块中的依赖项比顶级存储库中的 build.gradle 具有更高的优先级

java - Java中字符串分割的用法

java - SWT 中的扩展组合框

java - 从 Java 中的静态方法获取类名

java - Platform.getBundle 返回 null

java - 如何将字符串值拆分为字符串数组?

java - 此场景中的异常处理