Java 如何使用BundleContext从捆绑包清单中获取属性值?
以我对OSGi的熟练程度,我可以从以下位置获取属性字符串:Java 如何使用BundleContext从捆绑包清单中获取属性值?,java,osgi,manifest,Java,Osgi,Manifest,以我对OSGi的熟练程度,我可以从以下位置获取属性字符串: BundleContext.getProperty(键)(存储在'conf/config.properties'中) ComponentContext.getProperties().get(键)(存储在捆绑包的“MANIFEST.MF”中) 服务组件:\foo.bar.impl.FixServer;application=“quickfix.application”;属性:=“acceptor.resourcename=accepto
附录 根据阿瓦切夫和尼尔·巴特利特的回答
java.util.Dictionary headers = Bundle.getHeaders();
这是一个好办法
2011年12月10日编辑
但是,JAR清单语法(要求键中的第一个字符为大写,不允许“.”字符)会破坏我的应用程序键常量,除非我进行一些重构
如果我这样做,如果我以后使用.properties文件,应用程序将再次中断
为了克服JAR清单语法的(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,\
,以及将字符串摘要为属性的代码:
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);
}
}
}
java.util.Properties=new java.util.Properties();
java.util.Dictionary headers=bcontext.getBundle().getHeaders();
字符串manifest\u key=“Bundle Properties”;
字符串清单\值=(字符串)头.get(清单\键);
如果(清单值!=null){
字符串[]t=manifest_value.split(“,”);
对于(int i=0;i
我不完全确定您的目标是什么,但为什么不看看ConfigurationAdmin服务,它被定义为OSGi标准
设置所有bundle可用的属性的一种方法是在命令行中使用-Dproperty=value参数。如果您使用的是equinox,则可以将属性放入config.ini
Bundle.getHeader(…)方法怎么样?只需在MANIFEST.MF文件中指定类似于MY Property:Property的值,然后就可以通过Bundle.getHeader()访问它。这种方法的问题是MANIFEST.MF中要求的命名约定。问题的标题和正文不匹配。标题询问如何从包清单中获取属性值。。。这很简单:
Dictionary dict = bundleContext.getBundle().getHeader();
但是,问题的主体询问如何在清单中设置属性值。这在运行时是不可能的,因为清单在物理上是捆绑包的一部分,不能动态修改
如果您正在寻找某种束级配置数据,则考虑使用配置管理服务。捆绑清单中的属性是只读的,在创建包时定义。对我来说,这在部署更新时很有用。Bundle.getHeader(…)方法怎么样?只需在MANIFEST.MF文件中指定类似MY Property的内容:正确的值,然后就可以通过Bundle.getHeader()访问它,如果您的意思是“java.util.Dictionary headers=Bundle.getHeaders();”,那么是的,这个很合适。你能修改你的答案吗,这样我就可以把它勾选为已回答?唉,“KEY:VALUE”的清单格式正在破坏属性“KEY=VALUE”。清单键的第一个字符必须是大写的不允许使用字符。关于您的附录,我唯一的评论是您似乎决心为自己创建超出必要的工作!