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