我在尝试在 OSGi 容器内的多个包之间共享 Struts 包时遇到了这个问题。我想避免在包中重复依赖项并在它们之间引入新的依赖项(通过让一个包导出其内部依赖项以供另一个共享)。
事实证明,如果您碰巧使用 Maven,答案非常简单,如果您不是,您仍然可以使用 Maven 解决方案来学习如何使用其他机制创建相同的结果。
我发现这种方法在我的项目中多次有用,所以我将在这里发布一个示例。
对于那些不那么热衷于 maven、无法移植或对 ant/ivy 非常满意的人来说,这是一条额外的道路
我发现完成所述任务的最简单方法是通过让清单导出每个包并添加一些适当的符号名称/版本,将非 OSGi 库转换为 OSGi 库。我已经能够通过 ant 任务(甚至直接命令行调用)使用bnd非常轻松地做到这一点。还有一些存储库包含许多流行库的“osgi-ified”版本。一些库(joda-time)已经带有正确的 OSGi 清单。
使用 Maven,很容易从任何库创建 OSGi 包。但是,我认为其他机制也可以产生相同的结果。Maven 解决方案帮助我了解了它的工作原理。
通过创建一个将库作为依赖项的项目,然后使用Apache Felix 项目中的maven-bundle-plugin 打包项目并使用指令指定库包来完成创建包。我用它在 OSGi 容器内的包之间共享 Google 协议缓冲区:Export-Package
<?xml version="1.0" encoding="UTF-8" ?>
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.example.lib</groupId>
<artifactId>protobuf-dist</artifactId>
<version>2.1.0</version>
<name>Google Protocol Buffers OSGi Distribution</name>
<packaging>bundle</packaging>
<dependencies>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java</artifactId>
<version>2.1.0</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<instructions>
<Export-Package>com.google.protobuf</Export-Package>
</instructions>
</configuration>
</plugin>
</plugins>
</build>
</project>
如果您也希望将所有传递依赖项也包含到包中,请使用bundleall
插件的目标。
该插件识别并尊重依赖项中现有的 OSGi 清单。
您还可以使用捆绑插件来创建清单并告诉jar
打包插件(或jar-with-dependencies
内置程序集)通过存档部分使用该清单。上面链接的插件页面显示了如何做到这一点。