Karaf / Maven – 无法解决:缺少要求osgi.wiring.package
我无法在Karaf(版本3.0.1)中启动捆绑包。
该捆绑包使用maven构建,并导入gson 。
我根据需要在maven中包含了gson:
com.google.code.gson gson 2.3.1
构建顺利。 但是,在部署捆绑包时,我从Karaf收到此警告:
2015-05-27 12:45:07,371 | WARN | 49-19-bin/deploy | fileinstall | 11 - org.apache.felix.fileinstall - 3.2.8 | Error while starting bundle: file:/Users/user/Documents/tools/MyBundle-1.0.0-SNAPSHOT.jar org.osgi.framework.BundleException: Unresolved constraint in bundle MyBundle [121]: Unable to resolve 121.13: missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.gson)(version>=2.3.0)(!(version>=3.0.0))) at org.apache.felix.framework.Felix.resolveBundleRevision(Felix.java:3974)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.framework.Felix.startBundle(Felix.java:2037)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:955)[org.apache.felix.framework-4.2.1.jar:] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundle(DirectoryWatcher.java:1263)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startBundles(DirectoryWatcher.java:1235)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles(DirectoryWatcher.java:1224)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.process(DirectoryWatcher.java:519)[11:org.apache.felix.fileinstall:3.2.8] at org.apache.felix.fileinstall.internal.DirectoryWatcher.run(DirectoryWatcher.java:308)[11:org.apache.felix.fileinstall:3.2.8]
捆绑包未安装。
MANIFEST.MF
的Import-Package
以:
Import-Package: com.google.gson;version="[2.3,3)"
我试着改变它:
Import-Package: com.google.code.gson;version="[2.3,3)"
但它给了我一个类似的错误:
missing requirement [121.13] osgi.wiring.package; (&(osgi.wiring.package=com.google.code.gson)
pom.xml
:
4.0.0 groupid artifactid 0.0.1-SNAPSHOT groupid MyBundle 1.0.0-SNAPSHOT bundle MyBundle MyBundle true ... org.apache.felix org.apache.felix.http.jetty org.json com.springsource.org.json org.apache.servicemix.bundles org.apache.servicemix.bundles.commons-httpclient test org.postgresql postgresql 9.4-1201-jdbc41 com.google.code.gson gson 2.3.1 commons-codec commons-codec 1.10 org.apache.felix maven-bundle-plugin true ${project.artifactId} org.apache.maven.plugins maven-surefire-plugin ${skipTests}
Google GSON的MANIFEST.MF
(我在构建软件包时下载的版本maven)是:
Manifest-Version: 1.0 Export-Package: com.google.gson;version=2.3.1, com.google.gson.annotat ions;version=2.3.1, com.google.gson.reflect;version=2.3.1, com.google .gson.stream;version=2.3.1, com.google.gson.internal;version=2.3.1, c om.google.gson.internal.bind;version=2.3.1 Bundle-ClassPath: . Built-By: inder Bundle-Name: Gson Created-By: Apache Maven 3.2.1 Bundle-RequiredExecutionEnvironment: J2SE-1.5, JavaSE-1.6, JavaSE-1.7, JavaSE-1.8 Bundle-Vendor: Google Gson Project Bundle-ContactAddress: http://code.google.com/p/google-gson/ Build-Jdk: 1.6.0_65 Bundle-Version: 2.3.1 Bundle-ManifestVersion: 2 Bundle-Description: Google Gson library Bundle-SymbolicName: com.google.gson Archiver-Version: Plexus Archiver
我也尝试过
org.apache.felix maven-bundle-plugin true ${project.artifactId} *;resolution:=optional * true org.apache.maven.plugins maven-surefire-plugin ${skipTests}
现在嵌入了依赖项,但Karaf无法启动捆绑包。
我相信你有两个选择。
如果您的MANIFEST.MF
有Import-Package: com.google.gson;version="[2.3,3)"
,则表示您希望从已部署的包中导入某个包,而不是从嵌入式jar中导入。 在这种情况下,您应首先部署gson-2.3.1.jar
包(将此文件复制到deploy文件夹),然后部署您的包。
如果你想将gson库作为一个简单的非OSGi jar依赖项嵌入,也可以这样做,但是你必须从Import-Package
排除它Import-Package
:
org.apache.felix maven-bundle-plugin true ${project.artifactId} !com.google.gson,* gson