2013-09-13 4 views
2

У меня возник вопрос о связях OSGI и «нормальных» зависимостях maven.OSGI и maven зависимости между пучками и баночками

следующий сценарий:

мульти проект модуль Maven: A

с AX модулей, AM:

AX является OSGI Bundle

AM нормально приложений Java, который запускает каркас OSGI и загружает комплект AX

В проекте верхнего уровня pom (A.pom) Я определяю зависимость от commons-loggi ng-1.1.1 Затем я использую commons-logging в моем OSGI Bundle A.X. Плагин maven-bundle генерирует манифест для A.X с записью импорта, где происходит «commons-logging».

Когда я запускаю A.M и распечатываю все мои загруженные банки (с помощью getSystemClassLoader ...) на консоли, тогда ../../../commons-logging-1.1.1.jar указан. Из-за зависимости maven от pom верхнего уровня.

Теперь я пытаюсь установить свой комплект OSGI A.X и получить исключение «неразрешенное ограничение в пучке ..... commons-logging».

Почему не может быть разрешена зависимость от общего доступа (от A.X) с помощью библиотеки commons-logging lib, которая уже находится в памяти (в A.M), когда пакет установлен?

Я благодарен за любую помощь !!!!

+0

Является ли это встроенный OSGi среда?Я предполагаю, что пакеты commons-logging не находятся на пути класса загрузки контейнера OSGi. Или, если они есть, они получают версию 0.0.0 и ваши провода пакетов в более высокую версию. Попробуйте добавить эти пакеты в путь к загрузке с правильной версией. –

+0

Спасибо за ваш ответ! Я попробую! – Tobi

ответ

1

Распечатка загруженных банок с помощью getSystemClassLoader не обязательно говорит вам, что доступно через OSGi - помните, что OSGi имеет свои собственные механизмы загрузки классов.

Как я понимаю, общий доступ к журналу должен быть exported из другого пакета, так что OSGi может подключить его к вашему компоненту A.X. Вероятно, есть набор или функция для ведения общедоступных записей, которые вы можете легко добавить в качестве зависимости.

Я не уверен, какой контейнер OSGi вы используете (я использую Fuse), но должен быть какой-то способ взглянуть на импорт и экспорт пакетов, которые вы используете. Поскольку A.X импортирует commons-logging, другой пакет должен экспортировать его (с соответствующей версией).

В мире плавких предохранителей добавление зависимости от системного пакета так же просто, как добавление его в файл .xml. Но так как я не знаю, какой контейнер вы используете, я не уверен, как вы можете это сделать.

Помогает ли это?

+0

Спасибо за ваш быстрый ответ! Я использую Apache Felix, но я бы хотел использовать механизм, соответствующий стандарту. – Tobi

+0

Хорошо, можете ли вы увидеть какие-либо доступные пакеты для общедоступных лотов, отправленных с помощью Apache Felix? Рекомендуют ли они подход re: logging frameworks? – vikingsteve

+0

Доступен пул регистрации felix ... Спасибо:) ... Я думал, OSGI поддерживает в целом механизм использования пакетов с классическими jar-зависимостями, не переупаковывая их все в связку ... Я новичок в OSGI, я думаю, что у меня все еще есть концептуальный разрыв. – Tobi

0

Это потому, что один из ваших пакетов OSGI использует что-то в ведении журнала Commons, которое не является экспортированным пакетом в osgi. Таким образом, вы либо находите версию общедоступной регистрации, которая рассредоточена и экспортирует пакет, который вы пытаетесь использовать, либо добавляете банку в bundle-classpath пакета пользователей (есть и другие, более грязные варианты). Первый вариант намного лучше второго, поскольку он является модульным; т. е. вы могли бы обновлять общедоступные записи без изменения какого-либо другого пакета.

Как уже упоминались, тот факт, что это в приложении классов не имеет значения

Смежные вопросы