Java OSGI插件访问resources.jar中的文件
我不得不修改现有的应用程序作为OSGI插件,我偶然发现了以下问题。此应用程序依赖于Java OSGI插件访问resources.jar中的文件,java,eclipse,resources,osgi,osgi-bundle,Java,Eclipse,Resources,Osgi,Osgi Bundle,我不得不修改现有的应用程序作为OSGI插件,我偶然发现了以下问题。此应用程序依赖于jar文件中的xml文件,此应用程序也在运行时加载此文件,因此在OSGI环境中无法访问。任何关于如何解决这个问题的建议,到目前为止,我已经尝试了以下解决方案,但都没有产生任何积极的结果 这是它最初加载的方式 InputStream templateInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("resources/templ
jar
文件中的xml
文件,此应用程序也在运行时加载此文件,因此在OSGI环境中无法访问。任何关于如何解决这个问题的建议,到目前为止,我已经尝试了以下解决方案,但都没有产生任何积极的结果
这是它最初加载的方式
InputStream templateInputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("resources/template.xml");
我试着用以下方法来做
URL url = null;
try {
url = new URL("file:/lib/resources.jar");
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
URL[] urls = {url};
URLClassLoader classLoader = new URLClassLoader(urls, DeclareMapFactory.class.getClassLoader());
Thread.currentThread().setContextClassLoader(classLoader);
InputStream templateInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("resources/template.xml");
这也是一次尝试
InputStream templateInputStream = this.getClass().getClassLoader().getResourceAsStream("resources/template.xml");
Jar文件位于
lib
目录中,并通过MANIFEST.MF
加载,因此假设template.xml位于Jar resources.Jar中的resources/template.xml。这个jar在您的包中,并使用包类路径引用
在这种情况下,资源jar的内容应该添加到包的类路径中
因此,当您在bundle的一个类中时,您应该能够:
this.getClass().getClassLoader().getResourceAsStream("resources/template.xml")
如果这不起作用,那么您可能需要以“/”开始路径,但我认为它应该在没有“/”的情况下起作用。您能准确解释xml文件的位置吗?它是在您部署的捆绑包内还是在单独的resources.jar中?@ChristianSchneider,xml位于resources.jar文件中,该文件位于捆绑包的lib文件夹中,并在清单中引用:
bundle ClassPath:lib/resources.jar
我更喜欢代码模式MyClass.class.getResourceAsStream(“/resources/template.xml”)
。使用类文本比this.getClass()
更安全,因为如果该类曾经在另一个包中被子类化,那么this
将不是您期望的类型,并且类加载器(以及可见资源)可能不同。感谢各位,问题在于路径:)