使用osgi访问bundle内的公共属性文件

时间:2012-05-17 15:53:20

标签: java spring classpath osgi properties-file

我有一个带有多个包的osgi应用程序(在felix中)。一个包中有一些常见的属性文件,其余的包只需要使用它们。

我们使用maven和spring osgi,属性文件如下:

<path to bundle>/src/main/resources/
    common.properties
    engine.properties
    ...

Maven通常在bundle jar中构建它们,因此它们应该在应用程序类路径中,但是Spring无法访问它们,这会失败:

<context:property-placeholder location="classpath:common.properties" />

(尝试过classpath *:和其他组合)

我看过thisthis

它是否真的是osgi意识形态的全球问题,没有标准的方法让它运作?只有像that<osgix:cmProperties...>这样的黑客和解决方法?

之所以关注,是因为它使部署更加困难且容易出错:您无法像普通应用程序那样仅使用mvn deploy在jars中部署属性文件, - 您必须手动将它们复制到生产框中每个版本。

4 个答案:

答案 0 :(得分:5)

使用OSGi,没有通用的应用程序类路径。尽管属性位于包含它们的包的类路径中,但它们不一定位于使用它们的包的类路径中。

这有点难看,但通常导出包含属性文件夹的'package'会使它们可访问。在这种情况下,它看起来像'。',这非常难看,但您可以将它们放在'属性'目录(比如说)中,然后导出属性包。使用这些属性的bundle也需要导入属性包。

或者,使用包含bundle的类加载器来查找资源是可行的,尽管我无法评论Spring配置的内容。

答案 1 :(得分:2)

阅读所有捆绑包中的公共属性的最佳方法是使用由spring DM提供的纲要服务。

答案 2 :(得分:0)

我发现很少出现属性文件应该是“常见”的情况。你不能破坏属性文件的内容,并将它们放在实际需要它们的包中。属性应按上下文分组,并放在需要该上下文的包中。

理论上类似于不使用常量类或接口,这被认为是反模式。

答案 3 :(得分:0)

我最终使用的另一个替代方法是将属性文件放到文件系统中,并将它们从spring(或其他代码)引用为file:path/to/common.props