Osgi 从另一个捆绑包中读取以Karaf表示的属性文件

Osgi 从另一个捆绑包中读取以Karaf表示的属性文件,osgi,karaf,Osgi,Karaf,在Karaf中,有没有一种方法可以让一个包从另一个包中读取属性文件 我有bundle1,它包含bundle2使用的一些类(bundle1通过maven bundle插件导出其maven pom中包含这些类的包,bundle2导入它)。但是bundle2还需要使用bundle1中的属性文件。除了类之外,bundle2还有什么方法可以从bundle1访问文件 据我所知,一种选择是通过features文件将属性部署到karaf etc文件夹,然后通过blueprint从bundle2访问它。如果可能的

在Karaf中,有没有一种方法可以让一个包从另一个包中读取属性文件

我有bundle1,它包含bundle2使用的一些类(bundle1通过maven bundle插件导出其maven pom中包含这些类的包,bundle2导入它)。但是bundle2还需要使用bundle1中的属性文件。除了类之外,bundle2还有什么方法可以从bundle1访问文件


据我所知,一种选择是通过features文件将属性部署到karaf etc文件夹,然后通过blueprint从bundle2访问它。如果可能的话,我希望避免这种情况,因为bundle1目前没有作为一种功能部署。因此,希望有另一种方法。

最好的方法是通过bundle1类包装访问。假设bundle1包含一个名为MyClass的类。在该类中,可以执行以下操作。getClass().getResourceAsStream(路径)。路径是相对于类的包的

因此,此类的方法可以为属性文件返回Inputstream或允许访问实际属性


事实上,您还可以从bundle2访问属性文件。只需从bundle2中的类使用MyClass.getResourceAsStream(路径)。这是因为默认情况下,每个类都由它所在的bundle的类加载器加载。

最好的方法是通过bundle 1的类包装访问。假设bundle1包含一个名为MyClass的类。在该类中,可以执行以下操作。getClass().getResourceAsStream(路径)。路径是相对于类的包的

因此,此类的方法可以为属性文件返回Inputstream或允许访问实际属性


事实上,您还可以从bundle2访问属性文件。只需从bundle2中的类使用MyClass.getResourceAsStream(路径)。这是因为默认情况下,每个类都是由它所在的捆绑包的类加载器加载的。

Hm,我可以使用您的建议从它所在的捆绑包(bundle1)访问资源文件(有点…,即,我必须将其更改为…getClass().getClassLoader())。但是,从另一个bundle(bundle2)访问文件仍然会返回null。您需要使用bundle1中的类来获取类加载器。类似于MyClass.getClass().getClassLoader(),其中MyClass位于bundle1中。您可以从任何捆绑包中的任何类执行此操作,并将获得bundle1的类加载器。好的,我再试一次。但它必须是…getClass().getClassLoader(),对吗?我只想澄清一下,因为您的答案没有提到“getClassLoader()”部分。您可以同时使用这两个部分,但路径的解释会有所不同。getClass().getClassLoader().getResourceAsStream在类加载器中使用绝对路径,而getClass().getResourceAsStream()是相对于包的,如果您的类是这样的话。啊,非常感谢!这确实有助于澄清。我将资源文件移动到src/main/resources也有帮助。我无意中在src/main/java中使用了它,但它不起作用。现在工作!嗯,我可以使用您的建议从它所在的包(bundle1)中访问资源文件(有点…,例如,我必须将其更改为…getClass().getClassLoader())。但是,从另一个bundle(bundle2)访问文件仍然会返回null。您需要使用bundle1中的类来获取类加载器。类似于MyClass.getClass().getClassLoader(),其中MyClass位于bundle1中。您可以从任何捆绑包中的任何类执行此操作,并将获得bundle1的类加载器。好的,我再试一次。但它必须是…getClass().getClassLoader(),对吗?我只想澄清一下,因为您的答案没有提到“getClassLoader()”部分。您可以同时使用这两个部分,但路径的解释会有所不同。getClass().getClassLoader().getResourceAsStream在类加载器中使用绝对路径,而getClass().getResourceAsStream()是相对于包的,如果您的类是这样的话。啊,非常感谢!这确实有助于澄清。我将资源文件移动到src/main/resources也有帮助。我无意中在src/main/java中使用了它,但它不起作用。现在工作!