使用 OSGi 访问bundle中的公共属性文件



我有一个包含多个捆绑包的osgi应用程序(在felix中(。一个捆绑包中有一些公共属性文件,其余的捆绑包只需要使用它们。

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

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

Maven 通常将它们构建在捆绑 jar 中,因此它们应该位于应用程序类路径中,但 Spring 无法访问它们,这失败了:

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

(尝试过类路径*:和其他组合(

我读过这个和这个

这真的是 osgi 意识形态的全球性问题,没有标准的方式来让它发挥作用吗?只有像这样或<osgix:cmProperties...>的黑客和解决方法?

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

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

它有点丑陋,但一般来说,导出包含属性文件夹的"包"将使它们可访问。在这种情况下,它看起来像是".",这非常丑陋,但您可以将它们放在"属性"目录中(例如(,然后导出属性包。使用这些属性的捆绑包还需要导入属性包。

或者,使用包含捆绑包的类加载器来查找资源将起作用,尽管我无法评论 Spring 配置的外观。

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

我发现很少有属性文件应该是"通用"的情况。 您不能将属性文件的内容分解并将它们放在实际需要它们的捆绑包中吗? 属性应按上下文分组,并放置在需要该上下文的捆绑包中。

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

我最终使用的另一种选择 - 将属性文件放置到文件系统,并仅从 spring(或其他代码(引用它们作为file:path/to/common.props

最新更新