Java 如何使用BundleContext从捆绑包清单中获取属性值?

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

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

  • BundleContext.getProperty(键)(存储在'conf/config.properties'中)
  • ComponentContext.getProperties().get(键)(存储在捆绑包的“MANIFEST.MF”中)

    服务组件:\foo.bar.impl.FixServer;application=“quickfix.application”;属性:=“acceptor.resourcename=acceptor.cfg”

  • 我想在bundle清单中获取属性,可以在bundle级别(即BundleContext)访问,该级别高于“服务组件”(即ComponentContext)

    有人能告诉我怎么做吗


    附录

    根据阿瓦切夫和尼尔·巴特利特的回答

    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”。清单键的第一个字符必须是大写的不允许使用字符。关于您的附录,我唯一的评论是您似乎决心为自己创建超出必要的工作!