如何使用BundleContext从bundle manifest中获取属性值?

时间:2011-12-08 12:02:43

标签: java osgi manifest

凭借我对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”

  3. 我想在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);
            }
        }
    }
    

2 个答案:

答案 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服务。