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

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

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

main.java我想获得settings.xmlInputStream 。 这样做的正确方法是什么?

我目前的理解是以下代码应该工作,但它返回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"); 

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

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

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