OSGi felix: совместное использование класса между хост-приложением и пакетом возможно?


Внутри моего хост-приложения я попытался реализовать простой pushService, который должен использоваться для передачи экземпляра класса с именем транспортного средства в OSGi мир, предоставляя набор и метод get. Чтобы иметь возможность пользоваться услугой, я экспортировал как интерфейс сервиса, так и класс транспортного средства в файл jar и импортировал этот файл в пакет, который должен использовать сервис.

Каждый раз, когда я пытался использовать класс транспортного средства в моем хост-приложении, который инстанцирует фреймворк Феликса, и связка, я получил связь ошибка. После прочтения следующей записи в блоге (http://frankkieviet.blogspot.com/2009/03/javalanglinkageerror-loader-constraint.html ) Я понял, почему происходит эта ошибка. Но я понятия не имею, как решить свою проблему.

Можно ли разделить класс между хост-приложением и OSGi пример? Может быть, мне нужно использовать отражение вместо импорта файла jar? Я заглянул в эту библиотеку (http://code.google.com/p/transloader/) и я ... я не совсем уверен, сможет ли этот Либ решить мою проблему или нет ...

BR,

Маркус

1 3

1 ответ:

Одно время я использовал Felix, чтобы сделать именно то, что вы просите в пользовательском клиент-серверном приложении. С тех пор я перешел на Equinox (они правильно реализуют фрагменты фреймворка, которые мне нужны для swing LAF в виде пакетов osgi). Я думаю, что в Феликсе будет работать следующее, Я знаю, что это работает в равноденствии.

UPDATE: я начал очень похожий путь с моим хост-приложением. Я рано понял, что мне нужно переместить как можно больше кода в реальные пакеты OSGi, чтобы действительно воспользуйтесь преимуществами платформы. Мое хост-приложение устанавливает клиент-серверную связь и синхронизирует пакеты; вот и все. Несколько классов, которые я раньше делил, были перенесены в бандл, и я не оглядывался назад. Если вы разрабатываете / приложение может поддерживать наличие большинства кода в пакетах, я определенно пошел бы по этому пути. Даже если требуется какой-то редизайн, он того стоит.

Перед инициализацией среды выполнения OSGi задайте это свойство " org.OSGi для.рамки.система.пакеты", чтобы включить вас пакеты (нет подстановочные знаки), разделенные точкой с запятой";". Возможно, Вам дополнительно потребуется включить базовые пакеты osgi, " org.OSGi для.фреймворк "и базовые сервисы" орг.OSGi для.packageadmin", " org.OSGi для.startlevel", " org.OSGi для.URL-адрес".

Я просто покопался в своей системе управления версиями и нашел фрагмент, когда я все еще использовал Felix (настройка почти такая же для Equinox)

Map<String, String> configMap = new HashMap<String, String();

configMap.put(Constants.FRAMEWORK_SYSTEMPACKAGES,
    "your.package;other.package;org.osgi.framework");

// setup other properties

Bundle systemBundle = new Felix(configMap, null);
systemBundle.start();

// Now you can use classes from "your.package" with explicity 
// declaring them as imports in bundles