java - 如何使用 BundleContext 从包 list 中获取属性值?

标签 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"

我想在包 list 中获取属性,可在包级别(即 BundleContext)访问,该级别高于“服务组件”(即 ComponentContext)。

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


附录

来自 AValchev 和 Neil Bartlett 的回答,

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

是一个很好的方法。

2011-12-10 编辑

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

如果我这样做,如果我将来使用 .properties 文件,应用程序将再次中断。

为了克服 JAR list 语法的(IMO)“限制”,我想出了这个单一的 list 条目:

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);
        }
    }
}

最佳答案

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

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

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

关于java - 如何使用 BundleContext 从包 list 中获取属性值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8430741/

相关文章:

安卓更改应用程序图标

java - 什么是成员变量?它和实例变量一样吗?

java - 第三方 bundle 导入并使用系统 bundle 导出的任何版本的包

caching - 移动 Safari 应用程序缓存错误?

.net - requiredExecutionLevel requireAdministrator 没有按预期工作

osgi - 在OSGI/Eclipse中使用Log4j2.10和slf4j-api 1.8

java - 用java编写基于文本的ui来管理AccountList类的使用,无法使构造函数工作

java - 从 try 资源结构返回 Future

java - 编写斐波那契数列的方法

spring - 无法将 osgi 服务 bean 公开为类而不是接口(interface)