对OSGi捆绑包使用配置

时间:2018-09-04 03:33:08

标签: java osgi apache-karaf karaf

我正在制作OSGi捆绑包,并具有一些它需要的可配置参数。我遵循了instructions for karaf,配置值显示在webconsole中。但是如何在Java中使用它们?

我在执行器context.getProperty("prop1")甚至registering a ManagedService中都尝试过System.getProperty("prop1")。该属性始终返回为null。这应该真的很容易。我想念什么?

3 个答案:

答案 0 :(得分:0)

将配置属性设置为1etc/system.properties应该可以工作。

属性占位符(请参见40482233)和System.getProperty()(请参见30474886)也可以实现同样的目的。

答案 1 :(得分:0)

请看一下本教程:http://liquid-reality.de/display/liquid/2011/09/23/Karaf+Tutorial+Part+2+-+Using+the+Configuration+Admin+Service

它显示了如何以编程方式和使用蓝图使用ConfigAdmin属性。

答案 2 :(得分:0)

原因是使用updated()的{​​{1}}方法的竞争条件。它在调用ManagedService时执行,但registerService()不返回具有配置信息的configRef。另外,传递给properties的字典不会填充现有的配置值。

这里有一些简单的示例代码来更好地解释。 (注意:registerService()是groovy中的保留字。可能在这里引起一些问题):

properties

这将产生以下输出:

[WARN ] [..Activator] - properties.get() on updated():hello
[DEBUG] [..Activator] - context.getProperty():null
[DEBUG] [..Activator] - System.getProperty():null
[DEBUG] [..Activator] - configRef.properties.get():null
[DEBUG] [..Activator] - d.get():null
[DEBUG] [..Activator] - configuration.get():hello

更改class Activator implements BundleActivator, ManagedService{ private ServiceRegistration<ManagedService> configRef private Dictionary<String,?> configuration @Override void start(BundleContext context) throws Exception { Dictionary d=new Hashtable() d.put(Constants.SERVICE_PID,myPID) configRef=context.registerService(ManagedService,this,d) log.debug("context.getProperty():"+context.getProperty("prop1")) log.debug("System.getProperty():"+System.getProperty("prop1")) log.debug("configRef.properties.get():"+configRef.properties.get("prop1")) log.debug("d.get():"+d.get("prop1")) log.debug("configuration.get():"+configuration.get("prop1")) } ... @Override void updated(Dictionary<String, ?> properties) throws ConfigurationException { log.warn("properties.get() on updated():"+properties.get("prop1")) configuration=properties } 方法以填充类级Dictionary字段似乎可行。实际上,在updated()方法中为configuration使用d可能是一个更好的主意,但是此代码显示了实际情况。

感谢大家的帮助!