【问题标题】:Embed thirdparty JAR using BND使用 BND 嵌入第三方 JAR
【发布时间】:2011-11-25 03:23:29
【问题描述】:

我有一个使用 ANT 和经典 BND 工具构建的 OSGi 包。我的包在内部使用了一个库 (JAR),它在我的 OSGi 容器 (Apache Felix) 中不能作为包提供。所以,我试图将它嵌入到我的包中,以便在运行时访问。

如何使用 ANT+BND 嵌入这样的库/JAR? (注意:我不能使用 MAVEN,使用它本来可以更容易)

【问题讨论】:

    标签: ant osgi apache-felix bnd


    【解决方案1】:

    有一个由 BND 提供的 Ant 任务,名为 "bndwrap"。它没有很好的记录。当我尝试使用它时,我不得不阅读the Java code 以了解它在做什么。 (参见the bnd#doWrap() method here。)

    我记得还可以通过另一种方式“嵌入”一个依赖的 Jar 文件:不是直接作为 Jar-within-a-Jar,而是通过将其所有类放入您的包中,只需在您的Private-Package BND directive 另一个 Jar 提供的包应该包含在你的包中。或者,您可以在 Export-Package 指令中提及这些包,以将它们都包含在中。

    【讨论】:

      【解决方案2】:

      您的bnd 描述符中需要两条指令。首先使用 Include-Resource 将目标 JAR 包含到您的包中:

      Include-Resource: foo.jar
      

      然后您需要指定 foo.jar 需要位于 bundle 类路径中。我假设包内容本身也需要成为包类路径的一部分,所以我们也需要用一个点来包含它:

      Bundle-ClassPath: ., foo.jar
      

      请注意,@seh 关于使用 Private-Package 将 JAR 包放入您的包中的答案也是正确的(在这种情况下,JAR 需要在构建时类路径中可见)。不过,我永远不会为此使用Export-Package,因为我认为捆绑包应该严格控制它们的导出量。

      【讨论】:

      • “需要在构建时类路径上可见”——这到底是什么意思?你能说明更多吗?谢谢。
      • 这意味着它需要在提供给 ANT 任务的类路径上。 Bnd 从构建类路径中提取包,它并不真正关心它们是 3rd 方包还是您的代码。例如,如果我做了像Private-Package: javax.* 这样的傻事,我会将大部分 JRE 包含在我的包中!但是如果我说Private-Package: org.some.library.*,那么我只会得到org.some.library 包如果它们在类路径上。
      • 我不知道Bundle-Classpath 标头,从未使用过它。作为参考,它在 OSGi 核心规范 v4.3 的第 3.2.1.4 节中有描述。
      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2017-04-20
      • 1970-01-01
      相关资源
      最近更新 更多