我创建了一个依赖于SLF4J的捆绑包,因此使用Logback来实现OSGI。这一切都捆绑起来并安装正常,但是当我开始捆绑时,我得到以下异常:
org.osgi.framework.BundleException: 無法解析 com.felix.test [20](R 20.0): missing requirements [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)]
我可以在我的清单文件中看到< code>groovy.lang列在< code>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
我是用正确的方法还是有更好的方法?
谢谢!
根据您在问题中报告的异常,我认为您的osgi环境中没有一个包当前正在导出< code>groovy.lang包。我建议在您的运行时中安装felix gogo shell,并在osgi控制台中发出以下命令:
g! inspect cap osgi.wiring.package
这将为您提供osgi实例中所有导出包的列表:通过这种方式,您可以验证<code>是否为groovy。lang包确实丢失。
如果是这种情况,那么您应该按照此处的说明将groovy-all jar打包在一个包中,并将其包含在正在运行的osgi包中。如果需要,您可以在jpm4j网站中搜索随时可用的osgi捆绑包以查找groovy-all。
您不应该将所有的依赖项都嵌入到您的包中。取而代之的是用maven bundle插件默认值运行。它应该创建一个包,然后您可以将它部署到OSGi容器中。
我对Apache Karaf最有经验。在那里您可以使用以下方式安装捆绑包:
install -s mvn:groupId/artifactId/version
在您的情况下,这可能已经工作了,因为Apache Karaf预装了pax-logging。
如果你想使用普通的felix,那就有点复杂了,因为你必须收集所有依赖关系并创建一个合适的启动配置。在这种情况下,bndtools可能会有所帮助。
对于你的问题“我走的是正确的路”,答案是“绝对不是”!
请不要使用嵌入依赖关系
。这只需获取所有可传递依赖项图(在你的例子中,它以某种方式包括Groovy语言运行时),并将其粘贴到你的捆绑包中。
这完全忽略了OSGi的意义。更糟糕的是,当您开发下一个捆绑包时,您将不得不再次经历所有这些!最终您将拥有数十个捆绑包,每个捆绑包都承载着大量的嵌入式依赖项。
正如Christian所说,坚持maven-bundle-plugin
提供的默认值。您甚至不需要指定
我是OSGi的新手。我正在使用Apache Felix。我已经构建了一个捆绑包,并且具有依赖性。当我尝试使用启动它会给我这个错误。 org . OSGi . framework . bundle exception:无法解析lk . ucsc . research . belly runner[20](R 20.0):缺失需求[lk . ucsc . research . belly runner
以前部署的JDOM的OSGi包究竟是如何解决这些相同的依赖关系的?它们从来没有在捆绑进口包中列出?此外,如果我试图将这些作为项目的依赖项包含并嵌入它们,只会加剧问题。救命啊!
在上,使用require ex调用所有库。 并生成一个包含jquery的bundle
在感觉自己已经掌握了如何使用OSGi之后,我尝试向我的应用程序添加第三方依赖,特别是log4j2,该应用程序使用ApacheFelix并与maven捆绑插件捆绑。不幸的是,我似乎陷入了依赖地狱。 我尝试过使用许多maven捆绑包策略,如导入包,嵌入依赖,wrapImportPackage,Embed-Transitive,以及设置特定的版本号,仅举几例。以下是我的pom在这个插件中的样子: 我觉得
问题内容: 我有一个引用许多开源库的项目,其中一些是新的,有些不是那么新。也就是说,它们都很稳定,我希望坚持使用我选择的版本,直到我有时间迁移到较新的版本为止(我昨天测试了hsqldb 2.0,并且其中包含许多api更改)。 我希望嵌入的库之一是Jasper Reports,但众所周知,它附带了许多支持jar文件的程序,我只需要一部分(已知的)jar文件,因此我打算自定义捆绑所有程序包我的依存库。
简单的OSGi应用程序与包内的依赖关系。 我在玩karaf。我从写一个简单的Rest应用程序开始。https://github.com/YaroslavTir/osgi-jersey-hibertate/tree/stackoverflow/examples/karaf-rest-core 我将karaf示例作为backbond,使用restendpoint运行我的第一个包非常简单,但是当我添加m