我正在尝试使用 Karaf,我想知道是否可以将其配置为从 Apache Maven Central 存储库中提取传递依赖项。 无需使用"嵌入式捆绑包"
我已经知道你可以拉出显式依赖关系,问题的关键部分是"传递"依赖关系。
我也知道您可以使用 OBR 从已部署站点中的存储库.xml文件读取,但我找不到 Maven 中心的文件。 这个问题的一个可能的答案是添加 URL,但我在任何地方都找不到它记录了存储库.xml URL 是什么。
目前,我的解决方法是弄清楚依赖项是什么并将它们显式添加到
嵌入式捆绑包不适用于 Karaf OSGi 蓝图实现(它只是等待不存在的东西)。 我也觉得不得不这样做很丑陋。 对于这个问题,我能想到的另一个可能的答案是,是否有说明来创建可以部署到包含所有必要依赖项的任何OSGi容器(不仅仅是使用KAR文件的Karaf)的包。
您可以使用 karaf-maven-plugin 从 maven 依赖项创建功能文件。这将解决传递依赖关系。
我找到了一种使用Maven以相对OSGi标准的方式执行此操作的方法。 它使用 maven-dependency-plugin 创建一个仅包含运行时作用域所需的依赖项的存储库。
然后执行 maven-bundle-plugin:index 目标来创建存储库.xml文件。
此时,在目标中,您有一个有效的 obr 存储库,可以使用 maven-assembly-plugin 根据需要将其打包。
以下 pom.xml 片段将执行所需的操作。
<plugin>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-runtime-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<copyPom>true</copyPom>
<useRepositoryLayout>true</useRepositoryLayout>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<executions>
<execution>
<id>index</id>
<goals>
<goal>index</goal>
</goals>
<phase>verify</phase>
<configuration>
<mavenRepository>${project.build.directory}/dependency</mavenRepository>
</configuration>
</execution>
</executions>
</plugin>
至于 Karaf,可以使用以下命令在不使用 Karaf 功能的情况下安装这个捆绑包及其传递依赖项.xml:
features:install obr
obr:addUrl [location of the OBR repository, can be file:///....]
obr:deploy [symbolicname-of-bundle]
start [symbolicname-of-bundle]
瞧。
请注意,这只会加载您指定的捆绑包所引用的捆绑包,因此,如果您使用的是蓝图之类的东西,理论上它不应该知道其他捆绑包,那么您必须显式部署它们或创建一个包含您拥有的捆绑包的 uber 捆绑包(如功能/产品)
据我所知,你能做的最好的事情就是使用 Maven 下载所有依赖项,然后使用 Felix bnd 插件将您的本地(或远程)存储库转换为可以与 Karaf 一起使用的 OBR。