【发布时间】:2010-03-31 14:29:09
【问题描述】:
如果我的类路径目录中有一组资源文件,我可以使用ClassLoader.getResources(location) 枚举它们。
例如,如果我在类路径中有/mydir/myresource.properties,我可以调用类加载器的getResources("mydir") 并获取包含myresource.properties 的URL 的枚举。
当我将完全相同的资源打包到 .jar 中时,我在拨打电话时在 URL 的枚举中没有得到任何信息。我只用包含这些文件夹的 jar 替换了文件夹结构(它是一个 webapp,所以 jar 将进入/WEB-INF/lib)。我还接到了许多其他使用getResourceAsStream(location) 的电话,按名称单独获取其他资源,它们都工作正常。
当资源在 .jar 中时,枚举资源有什么不同?
更新 - 我已经重现(ish)容器外的行为。以下 sn-p 导致 dirProperties 对象的键设置为包中的资源名称,但如果包在 .jar 中,则会在 Properties.load(InputStream) 方法期间引发 NullPointerException。
Properties dirProperties = new Properties();
dirProperties.load(this.getClass().getClassLoader().getResourceAsStream(location));
容器 (Tomcat 5.5) 上的相同代码不会引发异常,但当文件位于 .jar 中时会生成一个空的 Properties 对象。
【问题讨论】:
-
我以前从未遇到过这种行为差异,但我可以想象给定的类加载器实现在将资源打包在 JAR 中时无法将资源表示为 URL 的情况。但是,我使用过的服务器(Jboss/Tomcat)可以做到这一点。
标签: java resources classpath classloader