【问题标题】:How do I find resources in a .jar on the classpath?如何在类路径的 .jar 中查找资源?
【发布时间】: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


【解决方案1】:

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

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

    /resources/ResourceGetter.class

    /resources/myprop.properties ....

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

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

【讨论】:

  • 嘿@sugaGenius,我在六年前发布了这个,我不记得我当时为什么对这个问题感兴趣,甚至不记得容器是什么! +1 试图提供帮助!
【解决方案2】:
this.getClass ().getClassLoader ().getResourceAsStream(location);

【讨论】:

  • 当然,我可以使用 getResourceAsStream(location) 而不是 getResources(location) 但它不能帮助我解决或理解我的问题,除非我错过了什么?
猜你喜欢
  • 2010-12-26
  • 1970-01-01
  • 2012-05-13
  • 2020-12-09
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2014-11-10
相关资源
最近更新 更多