【问题标题】:How to load a resource from an embedded JAR File如何从嵌入式 JAR 文件加载资源
【发布时间】:2011-08-01 22:08:00
【问题描述】:

我正在尝试加载包含在嵌入式 JAR 文件中的资源。该项目实际上是使用EAR 文件部署在JBoss 中,其结构如下:

deploy.ear
|
|-> project.sar
    |
    |-> sub_project.jar
    |   |
    |   |-> settings.xml
    |
    |-> com/path/project/
        |
        |-> main.class

来自main.java,我想为settings.xml 获取InputStream。这样做的正确方法是什么?

我目前的理解是以下代码应该可以工作,但它返回null

this.getClass().getResourceAsStream("settings.xml");

更新

经过反复试验,以下语句起作用:

getClass().getResourceAsStream("/settings.xml");
getClass().getResourceAsStream("/sub_project.jar/settings.xml");
getClass().getClassLoader().getResourceAsStream("/settings.xml");
getClass().getClassLoader().getResourceAsStream("settings.xml");
getClass().getClassLoader().getResourceAsStream("sub_project.jar/settings.xml");
getClass().getClassLoader().getResourceAsStream("/sub_project.jar/settings.xml");

【问题讨论】:

  • java 类加载器无法从嵌入式 jar 加载资源,因此您的设置将无法正常工作。一罐解决方案解决了这个问题,请参阅 Eran 的回答。
  • 不确定 /sub_project.jar/settings.xml 是标准符号。可能是 JBoss 扩展。
  • 我很惊讶为什么“settings.xml”失败,而“/settings.xml”工作,但后来我阅读了文档:如果资源名称以“/”开头,它不变;否则,包名会在转换“.”后附加到资源名前。到“/”。 Class.class 这样做,但 ClassLoader.class 没有。今天学到了一些新东西...

标签: java jboss jar classloader


【解决方案1】:

这可能是一个很好的资源:@​​987654321@

主要思想是内部 JAR 不是由自动加载外部 JAR 的 ClassLoader 加载的,您需要手动执行此操作,例如通过使用StreamClassLoader 加载内罐

只有这样,您才能从您自己的 ClassLoader 中使用 getResourceAsStream(...) 获取该资源

【讨论】:

  • 您是表示要使用 One-Jar,还是只是将其用作如何访问内部 jar 内容的参考?
  • 注意,最上面的不是JAR,而是EAR;这意味着它有一个比标准类加载器更复杂的类加载器。 EAR 类加载器根据 META-INF 内容处理来自嵌套 JAR 和 WAR 的加载资源。
  • @Vladimir:最初的问题没有说明这一点。 OP在原始问题中遗漏了那个关键细节。点击问题下方的edited [time]链接了解详情。
猜你喜欢
  • 2015-11-16
  • 2014-06-21
  • 1970-01-01
  • 1970-01-01
  • 2014-10-11
  • 2011-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多