Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java OSGI插件访问resources.jar中的文件_Java_Eclipse_Resources_Osgi_Osgi Bundle - Fatal编程技术网

Java OSGI插件访问resources.jar中的文件

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

我不得不修改现有的应用程序作为OSGI插件,我偶然发现了以下问题。此应用程序依赖于
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
将不是您期望的类型,并且类加载器(以及可见资源)可能不同。感谢各位,问题在于路径:)