凭借我对OSGi的熟练程度,我可以从以下地址获取属性字符串:
ComponentContext.getProperties()。get(key)(存储在bundle的'MANIFEST.MF'中)
服务组件:\ foo.bar.impl.FixServer; application =“quickfix.Application”; properties:=“acceptor.resourcename = acceptor.cfg”
我想在bundle清单中获取属性,可以在bundle级别(即BundleContext)访问,该属性高于'Service-Component'(即ComponentContext)。
有谁能告诉我这怎么办?
附录
来自AValchev和Neil Bartlett的答案,
java.util.Dictionary headers = Bundle.getHeaders();
是一种很好的方法。
编辑2011-12-10
然而,JAR Manifest语法(要求键中的第一个char为大写,'。'char禁止)会破坏我的app键常量,除非我进行一些重构。
如果我这样做,如果我将来使用.properties文件,应用程序将再次中断。
为了克服JAR Manifest语法的(IMO)'限制',我提出了这个单一的清单条目:
Bundle-Properties: \
foo.bar.prefix=MS,\
foo.bar.hostname=127.0.0.1,\
foo.bar.port=8106,\
foo.bar.homepath=/foo/bar/E3,\
foo.bar.secure=false,\
,以及将字符串摘要为Properties:
的代码java.util.Properties properties = new java.util.Properties();
java.util.Dictionary headers = bcontext.getBundle().getHeaders();
String manifest_key = "Bundle-Properties";
String manifest_value = (String) headers.get(manifest_key);
if (manifest_value != null) {
String[] t = manifest_value.split(",");
for (int i = 0; i < t.length; i++) {
String[] u = t[i].split("=");
if (1 < u.length) {
String key = u[0];
String value = u[1];
properties.setProperty(key, value);
}
}
}
答案 0 :(得分:4)
我不完全确定你的目标是什么,但为什么你不看看ConfigurationAdmin服务,它被定义为OSGi标准。
设置所有包可用属性的一种方法是在命令行中使用-Dproperty = value参数。如果您使用的是equinox,则可以将属性放入config.ini。
Bundle.getHeader(...)方法怎么样?只需在您的MANIFEST.MF文件中指定类似于MY-Property:proper-value,然后您就可以通过Bundle.getHeader()访问它。这种方法的问题是MANIFEST.MF中需要的命名约定。
答案 1 :(得分:4)
问题的标题和正文不符。标题询问如何从包清单中获取属性值...这很容易:
Dictionary dict = bundleContext.getBundle().getHeader();
但是,您的问题正文询问如何在清单中设置属性值。这在运行时是不可能的,因为清单实际上是bundle的一部分,不能动态修改。
如果您正在寻找某种捆绑级别的配置数据,请考虑使用Configuration Admin服务。