Karaf/Maven - 无法解决:缺少要求 osgi.wiring.package
Karaf / Maven - Unable to resolve: missing requirement osgi.wiring.package
我无法在 Karaf(版本 3.0.1)中启动捆绑包。
该包是使用 maven 构建的,它导入 gson.
我按要求在maven中包含了gson:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
构建顺利。但是,在部署捆绑包时,我收到了来自 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
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>groupid</groupId>
<artifactId>artifactid</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>groupid</groupId>
<artifactId>MyBundle</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>MyBundle</name>
<description>MyBundle</description>
<properties>
<skipTests>true</skipTests>
</properties>
<dependencies>
...
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.http.jetty</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>com.springsource.org.json</artifactId>
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.commons-httpclient</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1201-jdbc41</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>${skipTests}</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
Google GSON 的 MANIFEST.MF
(我构建 bundle 时 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
我也试过
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Import-Package>*;resolution:=optional</Import-Package>
<Embed-Dependency>*</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>${skipTests}</skipTests>
</configuration>
</plugin>
</plugins>
</build>
现在依赖项已嵌入,但 Karaf 无法启动包。
我相信你有两个选择。
如果您的 MANIFEST.MF
中有 Import-Package: com.google.gson;version="[2.3,3)"
,这意味着您希望从部署的包中导入一些包,而不是从嵌入式 jar 中导入。在这种情况下,您应该首先部署 gson-2.3.1.jar
捆绑包(将此文件复制到部署文件夹),然后再部署您的捆绑包。
如果你想将 gson 库作为一个简单的非 OSGi jar 依赖项嵌入,这也可以做到,但是你必须从 Import-Package
:
中排除它的包
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Import-Package>!com.google.gson,*</Import-Package>
<Embed-Dependency>gson</Embed-Dependency>
</instructions>
</configuration>
</plugin>
我遇到了同样的问题:
"Unable to resolve blah-blah: missing requirement blah-blah
osgi.wiring.package; (osgi.wiring.package=blah-blah) Unresolved
requirements: [blah-blah] osgi.wiring.package;
(osgi.wiring.package=blah-blah)].
我在 src/main/java
里面有一个激活剂 class。当我在 Java 中再创建一个包并将我的激活器放在这里时,问题就解决了。
结果是src/main/java/oneMorePackage/MyActivator
标签如下所示:
<Bundle-Activator>
oneMorePackage.MyActivator
</Bundle-Activator>
<Private-Package>
oneMorePackage
</Private-Package>
我遇到了同样的问题:
org.osgi.service.resolver.ResolutionException: Unable to resolve root: missing requirement [root] osgi.identity; ...... [caused by: Unable to resolve com.mycompany.somemodule/1.0.0.SNAPSHOT: missing requirement
并且通过更改有问题的包的 pom.xml 解决了(例如 com.mycompany.somemodule/pom.xml
):
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Export-Package>
com.mycompany.module.entity,
com.mycompany.somemodule.entity.v1,
com.mycompany.somemodule.entity.v2,
com.mycompany.somemodule.util
</Export-Package>
<Private-Package>
com.mycompany.somemodule,
com.mycompany.somemodule.translator
</Private-Package>
<Bundle-Name>Some Module</Bundle-Name>
<Bundle-SymbolicName>${project.name}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
</instructions>
最初,问题是我只暴露了这些包的一个子集:
...
<Export-Package>
com.mycompany.somemodule.entity.v2
</Export-Package>
<Private-Package>
</Private-Package>
...
我遇到过这种错误。
这意味着 Karaf 没有找到“依赖包”。
先安装依赖包,然后再安装你的包。
例如:
osgi:install mvn:com.yourCompany.corePackage.subPackage/yourDependencyBundle/1.0.0-SNAPSHOT
然后
osgi:install mvn:com.yourCompany.corePackage.subPackage/yourBundle/1.0.0-SNAPSHOT
我无法在 Karaf(版本 3.0.1)中启动捆绑包。
该包是使用 maven 构建的,它导入 gson.
我按要求在maven中包含了gson:
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
构建顺利。但是,在部署捆绑包时,我收到了来自 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
:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>groupid</groupId>
<artifactId>artifactid</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>groupid</groupId>
<artifactId>MyBundle</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>bundle</packaging>
<name>MyBundle</name>
<description>MyBundle</description>
<properties>
<skipTests>true</skipTests>
</properties>
<dependencies>
...
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.http.jetty</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>com.springsource.org.json</artifactId>
</dependency>
<dependency>
<groupId>org.apache.servicemix.bundles</groupId>
<artifactId>org.apache.servicemix.bundles.commons-httpclient</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>9.4-1201-jdbc41</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.10</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>${skipTests}</skipTests>
</configuration>
</plugin>
</plugins>
</build>
</project>
Google GSON 的 MANIFEST.MF
(我构建 bundle 时 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
我也试过
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Import-Package>*;resolution:=optional</Import-Package>
<Embed-Dependency>*</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
</instructions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skipTests>${skipTests}</skipTests>
</configuration>
</plugin>
</plugins>
</build>
现在依赖项已嵌入,但 Karaf 无法启动包。
我相信你有两个选择。
如果您的 MANIFEST.MF
中有 Import-Package: com.google.gson;version="[2.3,3)"
,这意味着您希望从部署的包中导入一些包,而不是从嵌入式 jar 中导入。在这种情况下,您应该首先部署 gson-2.3.1.jar
捆绑包(将此文件复制到部署文件夹),然后再部署您的捆绑包。
如果你想将 gson 库作为一个简单的非 OSGi jar 依赖项嵌入,这也可以做到,但是你必须从 Import-Package
:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Import-Package>!com.google.gson,*</Import-Package>
<Embed-Dependency>gson</Embed-Dependency>
</instructions>
</configuration>
</plugin>
我遇到了同样的问题:
"Unable to resolve blah-blah: missing requirement blah-blah osgi.wiring.package; (osgi.wiring.package=blah-blah) Unresolved requirements: [blah-blah] osgi.wiring.package; (osgi.wiring.package=blah-blah)].
我在 src/main/java
里面有一个激活剂 class。当我在 Java 中再创建一个包并将我的激活器放在这里时,问题就解决了。
结果是src/main/java/oneMorePackage/MyActivator
标签如下所示:
<Bundle-Activator>
oneMorePackage.MyActivator
</Bundle-Activator>
<Private-Package>
oneMorePackage
</Private-Package>
我遇到了同样的问题:
org.osgi.service.resolver.ResolutionException: Unable to resolve root: missing requirement [root] osgi.identity; ...... [caused by: Unable to resolve com.mycompany.somemodule/1.0.0.SNAPSHOT: missing requirement
并且通过更改有问题的包的 pom.xml 解决了(例如 com.mycompany.somemodule/pom.xml
):
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Export-Package>
com.mycompany.module.entity,
com.mycompany.somemodule.entity.v1,
com.mycompany.somemodule.entity.v2,
com.mycompany.somemodule.util
</Export-Package>
<Private-Package>
com.mycompany.somemodule,
com.mycompany.somemodule.translator
</Private-Package>
<Bundle-Name>Some Module</Bundle-Name>
<Bundle-SymbolicName>${project.name}</Bundle-SymbolicName>
<Bundle-Version>${project.version}</Bundle-Version>
</instructions>
最初,问题是我只暴露了这些包的一个子集:
...
<Export-Package>
com.mycompany.somemodule.entity.v2
</Export-Package>
<Private-Package>
</Private-Package>
...
我遇到过这种错误。 这意味着 Karaf 没有找到“依赖包”。
先安装依赖包,然后再安装你的包。
例如:
osgi:install mvn:com.yourCompany.corePackage.subPackage/yourDependencyBundle/1.0.0-SNAPSHOT
然后
osgi:install mvn:com.yourCompany.corePackage.subPackage/yourBundle/1.0.0-SNAPSHOT