如果我在类路径的目录中有一组资源文件,我可以使用ClassLoader.getResources(location)
枚举它们。
例如,如果我在类路径上有/mydir/myresource.properties
,我可以调用类加载器的getResources("mydir")
并获取包含myresource.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对象。
答案 0 :(得分:1)
虽然我有很多问题要求您准确地提出解决方案,但我可以请您尝试这个简单的步骤,它可以帮助您找到资源。我相信您用来查找资源的类加载器无法找到资源。所以你可以尝试如下(更多的解决方法):
将类与JAR中的其他资源一起打包。让此类打包在与其他资源相同的文件夹层次结构级别。在JAR内部,例如:
/resources/ResourceGetter.class
/resources/myprop.properties ....
在您想要这些资源文件的代码中使用ResourceGetter.class.getClassLoader()。getResourceAsStream()或getResources()。
如果您可以访问资源,您可以找到加载它的类加载器,您可以在那里解决您的问题。
答案 1 :(得分:0)
this.getClass ().getClassLoader ().getResourceAsStream(location);