Как OSGIFировать библиотеку

Я работаю над проектом, это проект интеграции, мы используем Apache Camel и Apache Karaf. В проекте мне нужно использовать клиентскую библиотеку Jira REST Java.

Итак, я прочитал довольно много различных статей и тем о том, как обернуть библиотеку, не относящуюся к OSGI, в пакет OSGI, но я действительно не уверен, правильно ли я понял.

Итак, я создал POM-файл с зависимостью от необходимой библиотеки. Сделал пакет и попытался развернуть его на Karaf, естественно, Karaf пожаловался на отсутствие пакетов.

Итак, я нашел соответствующую зависимость maven, добавил ее, пакет переходит в <Import-Package>, а зависимость в <Embed-Dependency>.

Еще раунд, деплой, найди зависимость, добавь, ... и еще, и еще, пока Karaf не устроит связку.

Это действительно правильно? Мне это кажется довольно сумасшедшим, так что, думаю, я не понял, как обычно :)

Наконец, пакет дошел до стабильной версии, которая была на моем рабочем компьютере, я быстро проверил и пошел домой, там я продолжил, но, странно, тот же POM/пакет, скомпилированный на моем персональном компьютере, не работает, снова жалуется на отсутствие пакета, но на этот раз этот пакет точно есть в POM-файле и наверняка он встроен в пакет, я его там вижу.

Этот отсутствующий пакет на этот раз org.apache.commons.codec.

org.osgi.framework.BundleException: Unresolved constraint in bundle jiraclient.bundle [134]: Unable to     resolve 134.0: missing requirement [134.0] osgi.wiring.package; (osgi.wiring.package=org.apache.commons.codec)
    at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3826)[org.apache.felix.framework-4.0.3.jar:]
    at org.apache.felix.framework.Felix.startBundle(Felix.java:1868)[org.apache.felix.framework-4.0.3.jar:]
    at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:944)[org.apache.felix.framework-4.0.3.jar:]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1247)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1219)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1208)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:503)[6:org.apache.felix.fileinstall:3.2.6]
    at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:291)[6:org.apache.felix.fileinstall:3.2.6]

Так что теперь я совсем запутался, что не так :(

Пожалуйста, ребята, помогите мне. Спасибо!

Файл POM длинный, поэтому я думаю, что ссылка лучше: http://pastebin.com/j5cmWveG


person stibi    schedule 25.10.2012    source источник
comment
Установили ли вы commons-codec в Karaf перед установкой пакета? Исключение говорит вам, что ему нужно импортировать пакет, который он не может найти. Да, ИМХО, исключения из Felix должны быть лучше объяснены конечному пользователю, что это значит.   -  person Claus Ibsen    schedule 26.10.2012
comment
Привет, Клаус, приятно снова встретиться с тобой (кстати, спасибо за книгу «Верблюд в действии» :)). Что это значит, установленный commons-codec? Похоже, что в моем экземпляре Karaf как минимум установлен и активен пакет: karaf@root› bundle:list | кодек grep [ 246] [Установлено ] [ ] [ ] [ 80] mvn:commons-codec/commons-codec/1.2 Этого достаточно? Предоставляет ли этот пакет необходимые классы? Я думаю, есть способ узнать экспорт пакетов, но я сейчас не знаю :( Кстати, у меня есть пакет commons-codec, встроенный в пакет библиотек, почему он не работает?   -  person stibi    schedule 26.10.2012
comment
Может быть, пакет должен явно экспортировать org.apache.commons.codec, чтобы встроенная библиотека jira rest могла использовать его в том же пакете? Имеет ли это смысл?   -  person stibi    schedule 26.10.2012
comment
Я тут, во всяком случае, довольно разговорчивый… Пробовал добавлять эти пакеты, на которые Караф жаловался, в ‹Export-Package›, и Караф остался доволен комплектом, по крайней мере, ошибок в логе нет. Теперь есть еще одна проблема, совершенно новая для меня, а именно: Вызвано: java.lang.ClassFormatError: Отсутствует атрибут кода в методе, который не является родным или абстрактным в файле класса javax/ws/rs/core/UriBuilder. :D   -  person stibi    schedule 26.10.2012


Ответы (1)


Да, OSGi, ИМХО, «далеко не прост в использовании» с точки зрения модели развертывания, требующей 100% пакетов с метаданными osgi в файлах MANIFEST.MF. И вам нужна докторская степень по математике, чтобы понять инструмент BND. И, к сожалению, многие JAR-файлы не являются пакетами OSGi.

Глядя на ваш файл pom.xml со всеми импортами | экспортами и этим «непростым для понимания» синтаксисом, любому среднестатистическому инженеру потребуется всего 5 секунд, чтобы понять, что это «что-то написано в штате Дания»; например, OSGi != мир, в котором мы живем. Это должно и должно быть проще ИМХО.

Вы можете установить простой JAR-файл в Karaf, используя обработчик URL wrap: http://karaf.apache.org/manual/latest/developers-guide/creating-bundles.html

Еще одна хитрость заключается в создании uber JAR, например, поместить все это в один файл JAR, а затем его можно развернуть.

Существует также FAB (Fuse Bundles), который упрощает развертывание OSGi, поскольку он справляется с большей частью этого сумасшествия во время развертывания вместо того, чтобы вам приходилось иметь дело с сумасшествием OSGi MANIFEST.MF: http://www.davsclaus.com/2012/08/osgi-deployment-made-easy-with-fab.html

person Claus Ibsen    schedule 26.10.2012
comment
Вы также можете попробовать динамический импорт * в вашем комплекте. Это можно настроить в плагине Felix Bundle. felix.apache.org/site/apache-felix- maven-bundle-plugin-bnd.html - person Claus Ibsen; 29.10.2012
comment
‹Пакет динамического импорта›*‹/Пакет динамического импорта› - person Claus Ibsen; 29.10.2012
comment
Это должно и должно быть проще ИМХО! - person igr; 20.03.2014