java - 如何在类路径的 .jar 中查找资源?

标签 java resources classpath classloader

如果我的类路径上的目录中有一组资源文件,我可以使用 ClassLoader.getResources(location) 枚举它们。

例如,如果我在类路径上有 /mydir/myresource.properties,我可以调用类加载器的 getResources("mydir") 并获取包含以下内容的 URL 枚举我的资源.properties

当我将完全相同的资源打包到一个 .jar 中时,我在调用时在 URL 枚举中没有得到任何东西。我只用包含这些文件夹的 jar 替换了文件夹结构(这是一个 webapp,所以 jar 进入 /WEB-INF/lib)。我还使用 getResourceAsStream(location) 进行了许多其他调用,以按名称单独获取其他资源,它们都工作正常。

当资源位于 .jar 中时,枚举资源有何不同?


更新 - 我已经重现(ish)容器外的行为。以下代码片段导致 dirProperties 对象将键设置为包中的资源名称,但如果包位于 .jar 中,则会在 Properties.load(InputStream) 方法期间抛出 NullPointerException。

Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));

容器 (Tomcat 5.5) 上的相同代码不会抛出异常,但当文件位于 .jar 中时会生成一个空的 Properties 对象。

最佳答案

虽然我有很多问题要问你以准确地提出解决方案,但我可以请你尝试这个简单的步骤,它可以帮助你找到资源。我相信您用来查找资源的类加载器无法找到资源。所以你可以尝试如下(更多的解决方法):

  1. 创建一个简单的空类(例如 ResourceGetter.class)
  2. 将类与 JAR 中的其他资源一起打包。让此类与其他资源打包在同一级别的文件夹层次结构中。在 JAR 中,例如:

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

  3. 在您需要这些资源文件的代码中使用 ResourceGetter.class.getClassLoader().getResourceAsStream() 或 getResources()。

如果你可以访问资源,你可以找到加载它的类加载器,你可以在那里解决你的问题。

关于java - 如何在类路径的 .jar 中查找资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2553773/

相关文章:

java - 配置 guice 进行基本字段注入(inject),无需 main 方法

java -/Library/Java/Extensions 的作用是什么 - 从那里添加或删除类是否安全?

java - 忽略 EclEmma 中单元测试的代码覆盖率

java - 为什么 Java NIO.2 中的异步 channel 需要这些暂停?

java - Tomcat 8 新的 Resource 实现将 Jar 文件映射到一个单独的目录中

java - getResourceAsStream 方法之间的区别

android - 如何处理从Android的数据库中获取的图像的不同dpi版本?从数据库或资源中读取图像更好吗?

java - 我在哪里可以找到以及如何修复我的 .classpath 文件

java - Eclipse 3.4 - 带有环境变量的外部 JAR

java - Java中的特殊字符