【问题标题】:How to get property values from bundle manifest using BundleContext?如何使用 BundleContext 从捆绑清单中获取属性值?
【发布时间】:2011-12-08 12:02:42
【问题描述】:

以我对 OSGi 的熟练程度,我可以从以下位置获取属性字符串:

  1. BundleContext.getProperty(key)(存储在“conf/config.properties”中)
  2. ComponentContext.getProperties().get(key)(存储在 bundle 的 'MANIFEST.MF' 中)

    服务组件:\ foo.bar.impl.FixServer;application="quickfix.Application";properties:="acceptor.resourcename=acceptor.cfg"

我想获取捆绑清单中的属性,可在捆绑级别(即 BundleContext)访问,它高于“服务组件”(即 ComponentContext)。

谁能告诉我如何做到这一点?


附录

来自 AValchev 和 Neil Bartlett 的回答,

java.util.Dictionary headers = Bundle.getHeaders();

是一个很好的方法。

于 2011 年 12 月 10 日编辑

但是,JAR Manifest 语法(要求键中的第一个字符为大写,并且不允许使用 '.' 字符)会破坏我的应用程序键常量,除非我进行一些重构。

如果我这样做了,如果我以后使用 .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 osgi manifest


    【解决方案1】:

    我不完全确定您的目标是什么,但为什么您不看一下定义为 OSGi 标准的 ConfigurationAdmin 服务。

    设置所有包可用的属性的一种方法是在命令行中使用 -Dproperty=value 参数。如果您使用的是 Equinox,则可以将您的属性放入 config.ini。

    Bundle.getHeader(...) 方法呢?只需在您的 MANIFEST.MF 文件中指定类似 MY-Property:proper-value 的内容,然后您就可以通过 Bundle.getHeader() 访问它。这种方法的问题在于 MANIFEST.MF 中要求的命名约定。

    【讨论】:

    • 捆绑清单中的属性是只读的,并在捆绑创建期间定义。对我来说,这在部署更新期间很有用。
    • Bundle.getHeader(...) 方法呢?只需在您的 MANIFEST.MF 文件中指定类似 MY-Property:proper-value 的内容,然后您就可以通过 Bundle.getHeader() 访问它
    • 如果你的意思是'java.util.Dictionary headers = Bundle.getHeaders();',那么是的,这很合适。您能否修改您的答案,以便我将其标记为已回答?
    • 唉,'KEY: VALUE' 的清单格式破坏了属性''KEY=VALUE'。
    • Manifest key 的第一个字符必须是大写。 '。'不允许使用字符。
    【解决方案2】:

    您的问题的标题和正文不匹配。标题询问如何从捆绑清单中获取属性值...这很简单:

    Dictionary dict = bundleContext.getBundle().getHeader();
    

    但是,您的问题主体询问如何设置清单中的属性值。这在运行时是不可能的,因为清单是捆绑包的物理部分,不能动态修改。

    如果您正在寻找某种捆绑级别的配置数据,请考虑使用配置管理服务。

    【讨论】:

    • 关于你的附录,我唯一的评论是你似乎决心为自己创造更多不必要的工作!
    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2023-01-23
    • 1970-01-01
    • 2012-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多