【问题标题】:Good way to "wrap" jars for OSGi with Maven使用 Maven 为 OSGi “包装” jar 的好方法
【发布时间】:2010-12-30 18:48:51
【问题描述】:

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

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

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

但这让我想知道:那里有什么东西可以满足我的要求吗?

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

注意:我知道嵌入和组装 jar 并不是真正的“OSGi 方式”——所以除非我真的觉得它有用,否则我不会这样做。例如 - 春天。

提前致谢。

【问题讨论】:

  • 我认为 Spring 已经有了 OSGi 友好的模块。如果您有需要使用的 jar,为什么不将它们嵌入到 OSGi 模块中?
  • 是的,Spring 确实如此。所以也许这是一个不好的例子——我的意思是,当你不需要这 15 个依赖项时,不得不部署 15 个依赖项(是否转换为捆绑包)可能会很痛苦。

标签: java maven osgi


【解决方案1】:

我编写了一个 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 通过与 SMX 合作,我发现那里有一些东西。谢谢(+1)
    【解决方案3】:

    我们做的事情与您所描述的类似。例如,我们有一个内部版本的 Apache QPid。它有 6 个 jars(客户端、核心、通用、反向端口等),您很少单独使用它们。我们有一个带有 BND 的 POM,它获取所有的 jar,并从中制作一个 uber-osgi-jar。

    步骤:

    1. 声明您的依赖项(我们有 jar,因此我们将它们声明为系统依赖项。)
    2. 导入构建插件 maven-bundle-plugin (2.1.0)
    3. 为导出、私有和导入包设置正确的说明
    4. 在“包装”阶段执行“包装”目标

    【讨论】:

    • 如果需要,我可能会附上 POM。
    • 是的,这就是我的意思“我想也许我可以通过创建一个简单的 POM 并使用 maven-bundle-plugin 来做到这一点,但这似乎对于我在问什么。”。但是,由于我认为现在没有更简单的解决方案,如果您发布 POM,我会接受,希望它能对其他人有所帮助:)
    【解决方案4】:

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

    我特别喜欢它抓住传递依赖并处理这些依赖。如果您不需要 repo,但只是在打包后,那么从 target/repository/plugins 文件夹中挑选它是一件简单的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-20
      • 2010-11-25
      • 2018-01-16
      • 2010-10-20
      • 2019-11-21
      • 2014-09-01
      • 2015-08-06
      • 2011-12-31
      相关资源
      最近更新 更多