如何在OSGi容器中的bundle之间共享非OSGi库?

时间:2009-08-05 19:04:27

标签: osgi

我在OSGi容器内的多个捆绑包中trying to share the Struts packages时遇到了这个问题。我想避免在bundle中复制依赖关系并在它们之间引入新的依赖关系(通过让一个bundle导出其内部依赖关系以供另一个共享)。

事实证明,如果您碰巧使用Maven,答案非常简单,如果您不是,您仍然可以使用Maven解决方案来学习如何使用其他机制创建相同的结果。

我发现这个方法在我的项目中多次有用,所以我将在这里发布一个例子。

2 个答案:

答案 0 :(得分:9)

对于那些不那么热衷于maven,无法移植或对蚂蚁/常春藤完全满意的人来说,这是另一条道路

我发现完成所述任务的最简单方法是将非OSGi库转换为OSGi库,方法是让清单导出每个包并添加一些适当的符号名称/版本。我已经能够通过ant任务(甚至直接命令行调用)使用bnd非常容易地完成这项工作。还有repositories包含许多流行库的“osgi-ified”版本。一些图书馆(joda-time)已经发布了正确的OSGi清单。

答案 1 :(得分:8)

使用Maven,可以很容易地从任何库创建OSGi包。但是,我认为也可以使用其他机制创建相同的结果。 Maven解决方案帮助我了解它是如何工作的。

创建捆绑包是通过创建一个项目来完成的,该项目将库作为依赖项,然后使用maven-bundle-plugin中的Apache Felix project打包项目并使用Export-Package指定库包。指令。我用它在OSGi容器中的bundle之间共享Google Protocol Buffers:

<?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内置程序集)通过归档部分使用该清单。上面链接的插件页面显示了如何做到这一点。