如何从嵌入式JAR文件加载资源

cmc*_*nty 5 java jboss jar classloader

我正在尝试加载嵌入的JAR文件中包含的资源.该项目实际上是使用具有以下结构的EAR文件部署在JBoss中的:

deploy.ear
|
|-> project.sar
    |
    |-> sub_project.jar
    |   |
    |   |-> settings.xml
    |
    |-> com/path/project/
        |
        |-> main.class
Run Code Online (Sandbox Code Playgroud)

main.java我希望得到InputStreamsettings.xml.这样做的正确方法是什么?

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

this.getClass().getResourceAsStream("settings.xml");
Run Code Online (Sandbox Code Playgroud)

更新

经过一些反复试验后,以下陈述有效:

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");
Run Code Online (Sandbox Code Playgroud)

Era*_*dan 2

这可能是一个很好的资源:http ://one-jar.sourceforge.net/version-0.95/

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

只有这样,您才能从您自己的类加载器中获取该资源getResourceAsStream(...)

  • @Vladimir:原来的问题没有说明这一点。OP 在最初的问题中遗漏了这个关键细节。单击问题下方的“已编辑[时间]”链接了解详细信息。 (2认同)