Как получить значения свойств из манифеста комплекта, используя BundleContext? - PullRequest
4 голосов
/ 08 декабря 2011

Имея уровень владения OSGi, я могу получить строки свойств из:

  1. BundleContext.getProperty (ключ) (хранится в 'conf / config.properties')
  2. ComponentContext.getProperties (). Get (ключ) (хранится в пакете 'MANIFEST.MF')

    Service-Component: \ foo.bar.impl.FixServer; application = "quickfix.Application"; свойства: = "acceptor.resourcename = acceptor.cfg"

Я хочу получить свойства в манифесте пакета, доступные на уровне пакета (т. Е. BundleContext), который выше, чем 'Service-Component' (т.е. ComponentContext).

Может кто-нибудь показать мне, как это можно сделать?


ДОПОЛНЕНИЕ

Из ответов А.В.Алчева и Нила Бартлетта,

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

- это хороший подход.

Отредактировано 2011-12-10

Тем не менее, синтаксис JAR Manifest (требующий, чтобы первый символ в ключе был прописным, а символ '.' Запрещен), нарушает константы ключа моего приложения, если я не сделаю некоторый рефакторинг.

Если я это сделаю, приложение снова сломается, если я буду использовать файл .properties в будущем.

Чтобы преодолеть (IMO) «ограничение» Синтаксиса манифеста JAR, я придумал эту единственную запись манифеста:

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

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Название и текст вашего вопроса не совпадают.Заголовок спрашивает, как получить значения свойств из манифеста комплекта ... это просто:

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

Однако в теле вашего вопроса спрашивается, как установить значения свойств в манифесте.Это невозможно во время выполнения, поскольку манифест физически является частью пакета и не может быть динамически изменен.

Если вам нужны какие-либо данные конфигурации на уровне пакета, рассмотрите возможность использования службы администратора конфигурации.

4 голосов
/ 08 декабря 2011

Я не совсем уверен, какова ваша цель, но почему вы не смотрите на сервис ConfigurationAdmin, который определен как стандарт OSGi.

Один из способов установки свойств, доступных для всех пакетов, - это параметр -Dproperty = value в командной строке. Если вы используете равноденствие, вы можете поместить свои свойства в config.ini.

А как насчет метода Bundle.getHeader (...)? Просто укажите в файле MANIFEST.MF что-то вроде MY-Property: Proper-value, и тогда вы сможете получить к нему доступ через Bundle.getHeader (). Проблема с этим подходом - соглашение об именах, требуемое в MANIFEST.MF.

...