Использование библиотеки, не относящейся к osgi, в приложении osgi

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

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

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


person Izza    schedule 08.02.2011    source источник


Ответы (4)


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

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

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

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

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

person Piotr    schedule 08.02.2011
comment
У первого подхода есть проблема. Внедрение транзитивных необязательных зависимостей будет проблемой. Я столкнулся с этой проблемой. Если у вас есть решение для этого, добавьте его. - person imcat; 24.06.2021

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

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

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

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

person Jan Uyttenhove    schedule 08.02.2011

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

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

person wesoly    schedule 08.02.2011

Для Eclipse IDE;

  1. Создайте папку libs под вашим пакетом.
  2. Добавьте свой jar-файл, который не является пакетом OSGi, в папку libs.
  3. Щелкните правой кнопкой мыши файл jar -> щелкните «Путь сборки» -> щелкните «Добавить в путь сборки»
person Coder    schedule 28.02.2020