如果我的类路径上的目录中有一组资源文件,我可以使用 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 对象。
最佳答案
虽然我有很多问题要问你以准确地提出解决方案,但我可以请你尝试这个简单的步骤,它可以帮助你找到资源。我相信您用来查找资源的类加载器无法找到资源。所以你可以尝试如下(更多的解决方法):
- 创建一个简单的空类(例如 ResourceGetter.class)
将类与 JAR 中的其他资源一起打包。让此类与其他资源打包在同一级别的文件夹层次结构中。在 JAR 中,例如:
/resources/ResourceGetter.class
/resources/myprop.properties ....
在您需要这些资源文件的代码中使用 ResourceGetter.class.getClassLoader().getResourceAsStream() 或 getResources()。
如果你可以访问资源,你可以找到加载它的类加载器,你可以在那里解决你的问题。
关于java - 如何在类路径的 .jar 中查找资源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2553773/