2009-08-05 54 views
8

我在一个OSGi容器内的多个包中找到了trying to share the Struts packages这个问题。我想要避免在bundle中重复依赖,并在它们之间引入一个新的依赖关系(通过让一个bundle导出其内部依赖关系来为其他人共享)。如何在OSGi容器中的软件包之间共享非OSGi库?

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

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

回答

7

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

创建包是通过创建具有图书馆作为一个依赖关系的项目,然后用包装从Apache Felix projectmaven-bundle-plugin项目,并与Export-Package指令指定库包完成。我用这束之间共享谷歌协议缓冲OSGi容器内:

<?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清单。

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

9

对于那些行家并不那么热衷,无法到港,或非常高兴与蚂蚁/常春藤

我发现来完成规定的任务是最简单的方法另外一个路径是把非OSGi的库导入到OSGi库中,方法是让清单导出每个包并添加一些适当的符号名称/版本。我已经能够很容易地通过蚂蚁任务(甚至直接命令行调用)使用bnd来完成此操作。也有repositories其中包含许多流行库的“osgi-ified”版本。一些图书馆(joda-time)已经出货正确的OSGi清单。

+1

还有一些存储库,其中包含许多流行库的“osgi-ified”版本:SpringSource是一个很大的版本:http://www.springsource.com/repository/app/ – Thilo 2009-08-06 01:57:52

+0

感谢您的链接! – basszero 2009-08-06 12:03:47