如何在OSGi容器中的捆绑包之间共享非OSGi库?

如何在OSGi容器中的捆绑包之间共享非OSGi库?,osgi,Osgi,在OSGi容器中的多个包中,我遇到了这个问题。我希望避免重复捆绑包内的依赖项,并在它们之间引入新的依赖项(通过让一个捆绑包导出其内部依赖项供另一个共享) 事实证明,如果您碰巧使用了Maven,答案非常简单,如果您没有,您仍然可以使用Maven解决方案来学习如何使用其他机制创建相同的结果 在我的项目中,我多次发现这种方法非常有用,因此我将在这里发布一个示例。使用Maven,从任何库创建OSGi包都非常容易。然而,我认为其他机制也可以产生同样的结果。Maven解决方案帮助我理解了它是如何工作的 创建

在OSGi容器中的多个包中,我遇到了这个问题。我希望避免重复捆绑包内的依赖项,并在它们之间引入新的依赖项(通过让一个捆绑包导出其内部依赖项供另一个共享)

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


在我的项目中,我多次发现这种方法非常有用,因此我将在这里发布一个示例。

使用Maven,从任何库创建OSGi包都非常容易。然而,我认为其他机制也可以产生同样的结果。Maven解决方案帮助我理解了它是如何工作的

创建捆绑包的方法是创建一个将库作为依赖项的项目,然后使用from打包该项目,并使用
Export Package
指令指定库包。我使用它在OSGi容器中的捆绑包之间共享Google协议缓冲区:

<?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>

4.0.0
com.example.lib
原蟾蜍区
2.1.0
Google协议缓冲区OSGi分发
捆
com.google.protobuf
protobuf java
2.1.0
编译
org.apache.felix
maven捆绑插件
真的
com.google.protobuf
如果您希望将所有可传递的依赖项也合并到bundle中,请使用插件的
bundlell
目标

该插件承认并尊重依赖关系中现有的OSGi清单


您还可以使用bundle插件创建清单,并通过归档部分告诉
jar
打包插件(或
jar with dependencies
内置程序集)使用该清单。上面链接的插件页面展示了如何做到这一点。

对于那些不太喜欢maven、无法移植或对ant/ivy不太满意的人来说,这是一条额外的途径


我发现完成上述任务最简单的方法是通过让清单导出每个包并添加一些合适的符号名/版本,将非OSGi库转换为OSGi库。通过ant任务(甚至直接命令行调用),我可以非常轻松地完成这项工作。还有一些包含许多流行库的“osgi-ified”版本。一些库(joda time)已经提供了正确的OSGi清单。

还有一些存储库包含许多流行库的“OSGi-ified”版本:SpringSource是一个大库: