使用Maven为OSGi“包装”罐子的好方法

时间:2010-12-30 18:48:52

标签: java maven osgi

我正在寻找OPS4J上的PAX工具,例如:this one我认为我找到了一个很好的方法:

  • 指定工件
  • 从该jar及其传递依赖项
  • 创建一个已组装的jar(包含所有依赖项的jar)
  • 用BND包装以创建OSGi包

事实证明,我错了 - 似乎PAX的东西没有这样做。 (RTFM,对吧?:))

但是这让我感到疑惑:那里有什么能满足我的要求吗?

我想也许我可以通过创建一个简单的POM并使用maven-bundle-plugin来做到这一点,但这似乎对我所要求的内容有点麻烦。

注意:我认为嵌入和组装jar并不是真正的“OSGi方式” - 所以我不会这样做,除非我真的认为它有用。例如 - Spring。

提前致谢。

4 个答案:

答案 0 :(得分:8)

我写了一个maven原型,它可以帮助你将jar包装成一个OSGI包。

假设您想要包含commons-collections版本3.2.1

首先获取原型并安装

git clone git://github.com/HallwayTech/maven-wrap-jar-archetype.git 
cd maven-wrap-jar-archetype
maven install

然后使用原型启动项目。

mvn archetype:create \
  -DarchetypeGroupId=com.hallwaytech.osgi \
  -DarchetypeArtifactId=wrap-jar \
  -DarchetypeVersion=1.0-SNAPSHOT \
  -DgroupId=commons-collections \
  -DartifactId=commons-collections \
  -Dversion=3.2.1

cd commons-collections

mvn install

要部署到Felix运行的Apache Sling:

mvn install -Pdeploy

答案 1 :(得分:4)

您必须维护本地POM才能完成此操作。没有一个实用程序可以接受库/ jar并在jar中吐出适当的OSGi MANIFEST。 ServiceMix和Spring一起捆绑了很多东西,可以作为示例使用。我建议看两个这样的例子:

  • commons-io - 简单的库包装器
  • OpenJPA - 包装主jar并使用它引入依赖项

答案 2 :(得分:2)

我们做了类似于你所描述的事情。例如,我们有一个Apache QPid的内部版本。它来自6个罐子(客户端,核心,通用,后端等),您很少单独使用它们。我们有一个带有BND的POM,它可以收集所有的罐子,然后从它们那里制作一个uber-osgi-jar。

步骤:

  1. 声明你的依赖项(我们有jar,所以我们将它们声明为系统deps。)
  2. 导入构建插件maven-bundle-plugin(2.1.0)
  3. 为导出,私有和导入包设置正确的说明
  4. 在'package'阶段执行'wrap'目标

答案 3 :(得分:1)

我尝试了The accepted answerErik's answer。 Erik的建议很简单,开箱即用。虽然,在我的情况下它似乎产生了巨大的MANIFEST,然后我回想起了p2-maven-plugin。最后一种方法在很多情况下都能很好地工作。如果您需要的工件已经是bundle,或者它的依赖项是bundle,它只是将它们放入它构建的repo中。如果没有,它将使用某些默认设置运行maven-bundle-plugin(或者您可以配置所需的设置)。很酷!

我特别喜欢它抓住传递依赖关系并且也会照顾它们。如果您不需要repo,但只是在包装的包之后,那么从target/repository/plugins文件夹中选择它是一件简单的事情。