如何在类路径中找到.jar中的资源?

时间:2010-03-31 14:29:10

标签: java resources classpath classloader

如果我在类路径的目录中有一组资源文件,我可以使用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对象。

2 个答案:

答案 0 :(得分:1)

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

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

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

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

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

答案 1 :(得分:0)

this.getClass ().getClassLoader ().getResourceAsStream(location);
相关问题