捆绑包内具有依赖项的简单 OSGi 应用程序
Simple OSGi application with dependencies inside bundle
简单的 OSGi 应用程序,包内有依赖项。
我在玩卡拉夫。我从编写一个简单的休息应用程序开始。
https://github.com/YaroslavTir/osgi-jersey-hibertate/tree/Whosebug/examples/karaf-rest-core
我将 karaf 示例作为 backbond,运行 我的第一个 bundle 与 rest 端点非常简单,但是当我添加 maven 依赖项时我遇到了一个问题。我以 guava 为例,在 karaf
中安装捆绑包时出现异常
<dependencies>
...
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Export-Package>org.apache.karaf.core.rest.blueprint</Export-Package>
<Import-Package>
*
</Import-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
> git clone https://github.com/YaroslavTir/osgi-jersey-hibertate
> mvn clean install
> feature:repo-add mvn:org.apache.karaf.examples/karaf-rest-core-features/LATEST/xml
> feature:install karaf-rest-core-blueprint
执行命令时出错:无法解析 root:缺少要求 [root] osgi.identity; osgi.identity=karaf-rest-core-blueprint;类型=karaf.feature; version="[4.3.1.SNAPSHOT,4.3.1.SNAPSHOT]";过滤器:="(&(osgi.identity=karaf-rest-core-blueprint)(类型=karaf.feature)(版本>=4.3.1.SNAPSHOT)(版本<=4.3.1.SNAPSHOT))" [原因:无法解析 karaf-rest-core-blueprint/4.3.1.SNAPSHOT:缺少要求 [karaf-rest-core-blueprint/4.3.1.SNAPSHOT] osgi.identity; osgi.identity=org.apache.karaf.examples.karaf-rest-core-blueprint;类型=osgi.bundle; version="[4.3.1.SNAPSHOT,4.3.1.SNAPSHOT]";分辨率:=强制性[原因:无法解决org.apache.karaf.examples.karaf-rest-core-blueprint/4.3.1.SNAPSHOT:缺少要求[org.apache.karaf.examples.karaf-rest-core-blueprint/4.3.1.SNAPSHOT] osgi.wiring.package;过滤器:="(&(osgi.wiring.package=com.google.common.collect)(版本>=29.0.0)(!(版本>=30.0.0)))"]]
我在某处读到 org.apache.felix.maven-bundle-plugin 有一个错误并向包添加了可选的依赖项,这看起来是真的,正如我在 MANIFEST 中看到的那样。MF/Import-Package 像 com.google.appengine.api 这样的依赖关系不应该存在。
:
<dependencies>
...
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Export-Package>org.apache.karaf.core.rest.blueprint</Export-Package>
<Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Embed-Directory>target/dependency</Embed-Directory>
</instructions>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
我知道这应该非常简单,我只是错过了一些小而重要的细节。
你的错误意味着你的包 karaf-rest-core-blueprint
依赖于 com.google.common.collect
并且这个依赖性无法在容器中解决。
换句话说,您没有将 guava 安装到 Karaf 中。
$ bundle:install -s mvn:com.google.guava/failureaccess/1.0.1
$ bundle:install -s mvn:com.google.guava/guava-29.0-jre
在真正的应用程序中,您应该创建一个功能来安装所有 dependencies/bundles。
您可能需要将 jar 转换为捆绑包并将其安装在 fuse/karaf 中,以便 fuse/karaf 解决“缺少的要求”。
如果您的本地存储库中有 jar,请使用此命令:
osgi:install wrap:mvn:com.missingRequirement.subPackage/artifact/version
示例:
osgi:install wrap:mvn:com.google.guava/failureaccess/1.0.1
如果依赖项已经是一个包(它可能是 jar 格式,但有一些特殊性,如 felix 插件),您可以简单地删除“wrap:”部分。
如果你不在一个简单的jar上使用'wrap',它将不会在fuse/karaf中被注册为一个服务(或bundle),错误也不会被解决。
提示:您可能需要下载一些依赖项。
使用 'mvn dependency:get'.
示例:
mvn dependency:get -Dartifact=org.apache.httpcomponents:httpmime:4.5.2.redhat-2
简单的 OSGi 应用程序,包内有依赖项。
我在玩卡拉夫。我从编写一个简单的休息应用程序开始。 https://github.com/YaroslavTir/osgi-jersey-hibertate/tree/Whosebug/examples/karaf-rest-core
我将 karaf 示例作为 backbond,运行 我的第一个 bundle 与 rest 端点非常简单,但是当我添加 maven 依赖项时我遇到了一个问题。我以 guava 为例,在 karaf
中安装捆绑包时出现异常 <dependencies>
...
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Export-Package>org.apache.karaf.core.rest.blueprint</Export-Package>
<Import-Package>
*
</Import-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
> git clone https://github.com/YaroslavTir/osgi-jersey-hibertate
> mvn clean install
> feature:repo-add mvn:org.apache.karaf.examples/karaf-rest-core-features/LATEST/xml
> feature:install karaf-rest-core-blueprint
执行命令时出错:无法解析 root:缺少要求 [root] osgi.identity; osgi.identity=karaf-rest-core-blueprint;类型=karaf.feature; version="[4.3.1.SNAPSHOT,4.3.1.SNAPSHOT]";过滤器:="(&(osgi.identity=karaf-rest-core-blueprint)(类型=karaf.feature)(版本>=4.3.1.SNAPSHOT)(版本<=4.3.1.SNAPSHOT))" [原因:无法解析 karaf-rest-core-blueprint/4.3.1.SNAPSHOT:缺少要求 [karaf-rest-core-blueprint/4.3.1.SNAPSHOT] osgi.identity; osgi.identity=org.apache.karaf.examples.karaf-rest-core-blueprint;类型=osgi.bundle; version="[4.3.1.SNAPSHOT,4.3.1.SNAPSHOT]";分辨率:=强制性[原因:无法解决org.apache.karaf.examples.karaf-rest-core-blueprint/4.3.1.SNAPSHOT:缺少要求[org.apache.karaf.examples.karaf-rest-core-blueprint/4.3.1.SNAPSHOT] osgi.wiring.package;过滤器:="(&(osgi.wiring.package=com.google.common.collect)(版本>=29.0.0)(!(版本>=30.0.0)))"]]
我在某处读到 org.apache.felix.maven-bundle-plugin 有一个错误并向包添加了可选的依赖项,这看起来是真的,正如我在 MANIFEST 中看到的那样。MF/Import-Package 像 com.google.appengine.api 这样的依赖关系不应该存在。 :
<dependencies>
...
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>29.0-jre</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<configuration>
<instructions>
<Export-Package>org.apache.karaf.core.rest.blueprint</Export-Package>
<Embed-Dependency>*;scope=compile|runtime;inline=false</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Embed-Directory>target/dependency</Embed-Directory>
</instructions>
</configuration>
</plugin>
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
我知道这应该非常简单,我只是错过了一些小而重要的细节。
你的错误意味着你的包 karaf-rest-core-blueprint
依赖于 com.google.common.collect
并且这个依赖性无法在容器中解决。
换句话说,您没有将 guava 安装到 Karaf 中。
$ bundle:install -s mvn:com.google.guava/failureaccess/1.0.1
$ bundle:install -s mvn:com.google.guava/guava-29.0-jre
在真正的应用程序中,您应该创建一个功能来安装所有 dependencies/bundles。
您可能需要将 jar 转换为捆绑包并将其安装在 fuse/karaf 中,以便 fuse/karaf 解决“缺少的要求”。
如果您的本地存储库中有 jar,请使用此命令:
osgi:install wrap:mvn:com.missingRequirement.subPackage/artifact/version
示例:
osgi:install wrap:mvn:com.google.guava/failureaccess/1.0.1
如果依赖项已经是一个包(它可能是 jar 格式,但有一些特殊性,如 felix 插件),您可以简单地删除“wrap:”部分。
如果你不在一个简单的jar上使用'wrap',它将不会在fuse/karaf中被注册为一个服务(或bundle),错误也不会被解决。
提示:您可能需要下载一些依赖项。 使用 'mvn dependency:get'.
示例:
mvn dependency:get -Dartifact=org.apache.httpcomponents:httpmime:4.5.2.redhat-2