2

我正在尝试使用 Karaf,我想知道是否可以将其配置为从 Apache Maven 中央存储库中提取传递依赖项。无需使用“嵌入式捆绑包”

我已经知道您可以提取显式依赖项,问题的关键部分是“传递”的。

我也知道您可以使用 OBR 从已部署站点中的 repository.xml 文件中读取,但我找不到用于 Maven 中心的文件。该问题的一个可能答案是添加 URL,但我无法在任何地方找到它记录的 repository.xml URL 是什么。

目前,我的工作是弄清楚依赖项是什么,并将它们显式添加到

嵌入式捆绑包不适用于 Karaf OSGi 蓝图实现(它只是等待不存在的东西)。我也觉得不得不这样做很难看。对于这个问题,我能想到的另一个可能的答案是,是否有说明创建一个可以部署到包含所有必要依赖项的任何OSGi 容器(不仅仅是使用 KAR 文件的 Karaf)的包。

4

3 回答 3

3

您可以使用 karaf-maven-plugin 从 maven 依赖项创建功能文件。这将解决传递依赖。

于 2012-06-03T11:52:48.583 回答
2

我找到了一种使用 Maven 以相对 OSGi 标准的方式执行此操作的方法。它使用 maven-dependency-plugin 创建一个存储库,该存储库仅包含运行时范围所需的依赖项。

然后执行 maven-bundle-plugin:index 目标以创建 repository.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 的 feature.xml 的情况下安装这个包及其传递依赖项:

features:install obr
obr:addUrl [location of the OBR repository, can be file:///....]
obr:deploy [symbolicname-of-bundle]
start [symbolicname-of-bundle]

瞧。

请注意,这只会加载您指定的捆绑包引用的捆绑包,因此如果您使用蓝图之类的东西,理论上它不应该知道其他捆绑包,那么您必须显式部署它们或创建一个将包含您拥有的捆绑包的超级捆绑包(如功能/产品)

于 2012-06-12T00:03:31.027 回答
1

据我所知,您能做的最好的事情是使用 Maven 下载所有依赖项,然后使用Felix bnd 插件将您的本地(或远程)存储库转换为可以与 Karaf 一起使用的 OBR。

于 2012-06-03T06:20:47.517 回答