Использование библиотеки не osgi в приложении osgi - PullRequest
13 голосов
/ 08 февраля 2011

Можно ли использовать не OSGI библиотеку с приложением OSGi?

Например, я разрабатываю семантическую поисковую систему и использую для нее стороннюю библиотеку обработки естественного языка (http://wiki.opencog.org/w/RelEx_Dependency_Relationship_Extractor).

Возможно ли связать такую ​​библиотеку, которая не поддерживает OSGi, как пару jar-файлов, с моим приложением OSGi?

Ответы [ 3 ]

22 голосов
/ 08 февраля 2011

Как было написано в предыдущих ответах, у вас есть два варианта, если вы хотите использовать дополнительные библиотеки в ваших пакетах:

  1. встраивание библиотечных jar-файлов в пакет, в котором они будут использоваться,
  2. создание действительного пакета OSGi из библиотеки.

Первый подход проще, потому что вам нужно только скопировать библиотечные jar-файлы (и все их зависимости) в пакет (например, в корневой каталог), а затем добавить их в элемент Bundle-Classpath в MANIFEST.MF (см. здесь ). Однако при этом вы должны помнить, что эта добавленная библиотека будет видна только в комплекте, в который она встроена (поэтому повторное использование библиотеки ограничено). Вы всегда можете добавить пакеты из этой библиотеки к элементу Export-package в MANIFEST.MF, чтобы сделать его видимым для других пакетов, но это далеко не элегантное решение (однако оно будет работать).

Чтобы сделать его видимым для других пакетов, вы должны использовать второй подход , то есть создать пакет OSGi из библиотеки (есть инструменты, которые могут помочь вам в этом, в том числе в Eclipse). Однако для более сложных библиотек этот подход может быть сложнее (из-за зависимостей и подхода к загрузке классов в OSGi).

Так что, если вы хотите использовать библиотеку только в одном комплекте, я предлагаю использовать первый подход (его легче реализовать). Если вы хотите использовать эту библиотеку во многих пакетах вашего приложения, вам следует рассмотреть второй подход.

5 голосов
/ 08 февраля 2011

Да, вы можете встроить внешнюю библиотеку в ваш пакет или обернуть ("OSGIfy") библиотеку в пакет OSGi.Для обоих вариантов Pax Construct (http://www.ops4j.org/projects/pax/construct) является хорошим инструментом.

Если ваша внешняя библиотека имеет зависимости, объедините их все в один пакет или используйте Pax Construct, чтобы обернуть их транзитивно.

Если вам нужно выбрать между упаковкой или встраиванием, рассмотрите возможность управления зависимостями и версиями пакетов. Если вам нужно обновить внешнюю библиотеку, и она встроена в ваш собственный пакет приложений, вы всегда выпускаете и библиотеку, и свой собственный кодНапример, также невозможно иметь активными 2 версии библиотеки без активной 2 версии вашего комплекта приложений. А также ... если вы не работаете в среде OSGi, хотели бы вы добавить сторонние классы вваше приложение вызывает раздражение? Так зачем делать это в среде OSGi?

Я лично предпочитаю в таком случае видеть внешнюю библиотеку в виде черного ящика и оборачивать библиотеку и ее зависимости в один пакет.

3 голосов
/ 08 февраля 2011

Да, это возможно.У вас есть два варианта:

Во-первых, вы можете включить все пакеты из внешней библиотеки в раздел private-package вашего пакета.Все эти пакеты будут включены в jar с вашим приложением.Второй вариант - создать действительный пакет osgi из внешней библиотеки.

...