Зависимости пакета OSGI

Я создал пакет, основанный на SLF4J, и поэтому использую Logback для реализации OSGI. Все это объединяется и устанавливается нормально, но когда я запускаю пакет, я получаю следующее исключение:

org.osgi.framework.BundleException: невозможно разрешить com.felix.test [20](R 20.0): отсутствует требование [com.felix.test [20](R 20.0)] osgi.wiring.package; (osgi.wiring.package=groovy.lang) Нерешенные требования: [[com.felix.test [20](R 20.0)] osgi.wiring.package; (osgi.wiring.package=groovy.lang)]

В моем файле манифеста я вижу, что groovy.lang указан в Import-Package, и я почти уверен, что проблема в том, что Logback встраивается, но ни одна из его ссылок не является.

Я использую для создания пакета, вот конфиг:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
    <version>2.5.4</version>
    <extensions>true</extensions>
    <configuration>
        <instructions>
            <Import-Package>
                *
            </Import-Package>
            <Embed-Dependency>
                *
            </Embed-Dependency>
            <Embed-Directory>
                osgi-inf/libs
            </Embed-Directory>
            <Embed-Transitive>
                true
            </Embed-Transitive>
        </instructions>
    </configuration>
</plugin>

Вот мой манифест:

Manifest-Version: 1.0
Bnd-LastModified: 1436982944102
Build-Jdk: 1.8.0_45
Built-By: tim.clifford
Bundle-ClassPath: .,osgi-inf/libs/org.osgi.core-1.0.0.jar,osgi-inf/libs/
 servlet-api-2.5.jar,osgi-inf/libs/org.apache.felix.scr.annotations-1.9.
 6.jar,osgi-inf/libs/httpclient-osgi-4.5.jar,osgi-inf/libs/httpclient-4.
 5.jar,osgi-inf/libs/httpcore-4.4.1.jar,osgi-inf/libs/commons-logging-1.
 2.jar,osgi-inf/libs/commons-codec-1.9.jar,osgi-inf/libs/httpmime-4.5.ja
 r,osgi-inf/libs/httpclient-cache-4.5.jar,osgi-inf/libs/fluent-hc-4.5.ja
 r,osgi-inf/libs/ehcache-2.10.0.jar,osgi-inf/libs/slf4j-api-1.7.7.jar,os
 gi-inf/libs/commons-lang3-3.4.jar,osgi-inf/libs/logback-classic-1.1.3.j
 ar,osgi-inf/libs/logback-core-1.1.3.jar
Bundle-ManifestVersion: 2
Bundle-Name: com.felix.test
Bundle-SymbolicName: com.felix.test
Bundle-Version: 1.0.0.SNAPSHOT
Created-By: Apache Maven Bundle Plugin
Embed-Dependency: *
Embed-Directory: osgi-inf/libs
Embed-Transitive: true
Embedded-Artifacts: osgi-inf/libs/org.osgi.core-1.0.0.jar;g="org.apache.
 felix";a="org.osgi.core";v="1.0.0",osgi-inf/libs/servlet-api-2.5.jar;g=
 "javax.servlet";a="servlet-api";v="2.5",osgi-inf/libs/org.apache.felix.
 scr.annotations-1.9.6.jar;g="org.apache.felix";a="org.apache.felix.scr.
 annotations";v="1.9.6",osgi-inf/libs/httpclient-osgi-4.5.jar;g="org.apa
 che.httpcomponents";a="httpclient-osgi";v="4.5",osgi-inf/libs/httpclien
 t-4.5.jar;g="org.apache.httpcomponents";a="httpclient";v="4.5",osgi-inf
 /libs/httpcore-4.4.1.jar;g="org.apache.httpcomponents";a="httpcore";v="
 4.4.1",osgi-inf/libs/commons-logging-1.2.jar;g="commons-logging";a="com
 mons-logging";v="1.2",osgi-inf/libs/commons-codec-1.9.jar;g="commons-co
 dec";a="commons-codec";v="1.9",osgi-inf/libs/httpmime-4.5.jar;g="org.ap
 ache.httpcomponents";a="httpmime";v="4.5",osgi-inf/libs/httpclient-cach
 e-4.5.jar;g="org.apache.httpcomponents";a="httpclient-cache";v="4.5",os
 gi-inf/libs/fluent-hc-4.5.jar;g="org.apache.httpcomponents";a="fluent-h
 c";v="4.5",osgi-inf/libs/ehcache-2.10.0.jar;g="net.sf.ehcache";a="ehcac
 he";v="2.10.0",osgi-inf/libs/slf4j-api-1.7.7.jar;g="org.slf4j";a="slf4j
 -api";v="1.7.7",osgi-inf/libs/commons-lang3-3.4.jar;g="org.apache.commo
 ns";a="commons-lang3";v="3.4",osgi-inf/libs/logback-classic-1.1.3.jar;g
 ="ch.qos.logback";a="logback-classic";v="1.1.3",osgi-inf/libs/logback-c
 ore-1.1.3.jar;g="ch.qos.logback";a="logback-core";v="1.1.3"
Export-Package: com.felix.test;version="1.0.0"
Import-Package: groovy.lang,javax.crypto,javax.crypto.spec,javax.jms,jav
 ax.mail,javax.mail.internet,javax.management,javax.management.openmbean
 ,javax.naming,javax.naming.directory,javax.naming.ldap,javax.net,javax.
 net.ssl,javax.security.auth.x500,javax.sql,javax.swing.event,javax.tran
 saction,javax.transaction.xa,javax.xml.datatype,javax.xml.namespace,jav
 ax.xml.parsers,javax.xml.stream,javax.xml.stream.events,net.spy.memcach
 ed,org.apache.avalon.framework.logger,org.apache.felix.scrplugin,org.ap
 ache.felix.scrplugin.annotations,org.apache.felix.scrplugin.description
 ,org.apache.log,org.apache.log4j,org.codehaus.commons.compiler,org.code
 haus.groovy.control,org.codehaus.groovy.control.customizers,org.codehau
 s.groovy.reflection,org.codehaus.groovy.runtime,org.codehaus.groovy.run
 time.callsite,org.codehaus.groovy.runtime.typehandling,org.codehaus.gro
 ovy.runtime.wrappers,org.codehaus.groovy.transform,org.codehaus.janino,
 org.hibernate,org.hibernate.cache,org.hibernate.cache.access,org.hibern
 ate.cfg,org.hibernate.impl,org.hibernate.stat,org.hibernate.transaction
 ,org.ietf.jgss,org.osgi.service.cm,org.quartz,org.quartz.impl,org.quart
 z.impl.jdbcjobstore,org.quartz.impl.matchers,org.quartz.simpl,org.terra
 cotta.quartz,org.terracotta.toolkit,org.terracotta.toolkit.atomic,org.t
 erracotta.toolkit.builder,org.terracotta.toolkit.cache,org.terracotta.t
 oolkit.cluster,org.terracotta.toolkit.collections,org.terracotta.toolki
 t.concurrent.locks,org.terracotta.toolkit.config,org.terracotta.toolkit
 .events,org.terracotta.toolkit.feature,org.terracotta.toolkit.internal,
 org.terracotta.toolkit.internal.cache,org.terracotta.toolkit.internal.c
 luster,org.terracotta.toolkit.internal.collections,org.terracotta.toolk
 it.internal.concurrent.locks,org.terracotta.toolkit.internal.feature,or
 g.terracotta.toolkit.monitoring,org.terracotta.toolkit.nonstop,org.terr
 acotta.toolkit.rejoin,org.terracotta.toolkit.search,org.terracotta.tool
 kit.search.attribute,org.terracotta.toolkit.store,org.xml.sax,org.xml.s
 ax.helpers,sun.misc,sun.reflect
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=1.6))"
Tool: Bnd-2.4.1.201501161923

Я делаю это правильно или есть лучший метод?

Спасибо!


person timothyclifford    schedule 15.07.2015    source источник


Ответы (3)


На ваш вопрос "верным ли я образом иду" ответ "определенно нет"!

Пожалуйста, не используйте Embed-Dependency. Это просто берет весь граф транзитивных зависимостей (который в вашем случае каким-то образом включает среду выполнения языка Groovy) и вставляет его в ваш пакет.

Это полностью упускает смысл OSGi. Хуже того, когда вы будете разрабатывать следующую связку, вам придется проходить все это заново! В конце концов у вас будут десятки пакетов, каждый из которых несет огромный мертвый груз встроенных зависимостей.

Как сказал Кристиан, придерживайтесь значений по умолчанию, предоставленных файлом maven-bundle-plugin. Вам даже не нужно указывать <Import-Package>*</Import-Package>, так как это уже значение по умолчанию. В результате вы получите пакет с импортом пакетов, и это хорошо! Но вам нужно установить пакеты, которые обеспечивают экспорт, который будет соответствовать вашему импорту.

person Neil Bartlett    schedule 15.07.2015
comment
Не могли бы вы удалить веб-сайт jpm4j, потому что прямо сейчас этот сайт пытается предложить установить какой-то плагин для браузера. - person Evgeny Kiselev; 27.02.2018
comment
@EvgenyKiselev Спасибо за уведомление. Похоже, срок действия домена jpm4j истек, и его захватили спамеры. - person Neil Bartlett; 28.02.2018

Вы не должны встраивать все зависимости в свой пакет. Вместо этого просто запустите с настройками плагина пакета maven по умолчанию. Он должен создать пакет, который затем можно развернуть в контейнере OSGi.

У меня больше всего опыта работы с Apache Karaf. Там вы можете просто установить пакет, используя:

install -s mvn:groupId/artifactId/version

В вашем случае это может уже работать, так как Apache Karaf поставляется с предустановленным протоколированием pax.

Если вы хотите использовать простой felix, это немного сложнее, так как вам нужно будет собрать все зависимости и создать подходящую стартовую конфигурацию. В этом случае может помочь bndtools.

person Christian Schneider    schedule 15.07.2015

Из исключения, о котором вы сообщили в своем вопросе, я бы сказал, что ни один из пакетов в вашей среде osgi в настоящее время не экспортирует пакет groovy.lang. Я бы предложил установить оболочку felix gogo в среде выполнения и выполнить следующую команду в консоли osgi:

g! inspect cap osgi.wiring.package

Это даст вам список всех экспортированных пакетов в вашем экземпляре osgi: таким образом вы можете проверить, действительно ли отсутствует пакет groovy.lang.

Если это так, вам следует обернуть банку groovy-all. в пакете, как описано здесь, и включите его в работающий osgi. связки. Если вы хотите, вы можете найти готовый к использованию пакет osgi для groovy-all на веб-сайте jpm4j.

person matteo rulli    schedule 15.07.2015
comment
Конечно, лучший ответ — не заключать весь граф транзитивных зависимостей в один пакет?!? - person Neil Bartlett; 16.07.2015