如何获取某些 OSGI Bundle 的配置文件内容

How to get a content of config file for some OSGI Bundle

我有以下结构:

-- bundles
---- nicebundle
------ src
-------- ...
-------- nicebundle.config
---------- NiceConfig.java
-------- ...
----  mybundle
------ ...
----  another bundles...

-- features
----  nicebundle.config.feature
------  rootifles
--------  config.cfg
------  ...
----  another features...

config.cfg中有一些常量,我想在mybundle中使用(在activate()方法中)。我在 NiceConfig.java 中为 nicebundle 的是 NiceConfig @interface,它只是镜像地列出了 .cfg 文件中的所有内容,如 String importantString();,并且在 .cfg 文件中有一个相应的记录: importantString=Hello

对于 nicebundle,您只需加载 NiceConfig 对象,调用方法并接收所需的常量,例如:

@Activate
public void activate(final NiceConfig niceConfig) {
    String compositeString = niceConfig.importantString() + " World"; // receive "Hello World"
    ...

我想要的 - 在 mybundle 中做同样的事情。但是,当我这样做时,niceConfig.importantString() returns 为空,而不是“你好”。我想我错过了一些非常简单和明显的东西,但我的问题是:我怎样才能在 mybundle?

中找到我上面指定的(我无法更改它)的 .cfg 文件的内容

声明式服务 (DS) 将强制 component properties into an annotation type, like your NiceConfig type. But component properties come from the component description and configurations in Configuration Admin

DS 对 Eclipse 功能中的某些配置文件一无所知。而且 Eclipse 特性甚至没有安装包,所以无论如何在运行时都不可见。

您可以使用 Configurator specification 的实现将资源包中的属性配置到 DS 组件的相应配置管理配置中。但这将需要进行一些结构更改才能将配置文件从功能部件移动到您的包中。

简而言之,对我来说正确的答案是执行以下步骤:

  1. 在方括号中的 .cfg-File 中指定新的 PID,例如[VeryNiceConfig] 然后在此方括号行之后指定我的所有参数,例如VeryNiceInt=42

  2. configurationPid = "VeryNiceConfig", configurationPolicy = ConfigurationPolicy.REQUIRE 添加到 @Component 注释。

  3. 然后将我的 Config @interface 对象作为参数添加到我的包的 activate() 方法中,并将其用于荣耀。

这在 eclipse 中不起作用,因为 .cfg-File 是通过该功能添加的,并且没有直接注入 eclipse.exe,但它在(在我的例子中)maven 构建之后起作用。