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 ответ:
Одно время я использовал 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