【发布时间】:2011-11-25 03:23:29
【问题描述】:
我有一个使用 ANT 和经典 BND 工具构建的 OSGi 包。我的包在内部使用了一个库 (JAR),它在我的 OSGi 容器 (Apache Felix) 中不能作为包提供。所以,我试图将它嵌入到我的包中,以便在运行时访问。
如何使用 ANT+BND 嵌入这样的库/JAR? (注意:我不能使用 MAVEN,使用它本来可以更容易)
【问题讨论】:
标签: ant osgi apache-felix bnd
我有一个使用 ANT 和经典 BND 工具构建的 OSGi 包。我的包在内部使用了一个库 (JAR),它在我的 OSGi 容器 (Apache Felix) 中不能作为包提供。所以,我试图将它嵌入到我的包中,以便在运行时访问。
如何使用 ANT+BND 嵌入这样的库/JAR? (注意:我不能使用 MAVEN,使用它本来可以更容易)
【问题讨论】:
标签: ant osgi apache-felix bnd
有一个由 BND 提供的 Ant 任务,名为 "bndwrap"。它没有很好的记录。当我尝试使用它时,我不得不阅读the Java code 以了解它在做什么。 (参见the bnd#doWrap() method here。)
我记得还可以通过另一种方式“嵌入”一个依赖的 Jar 文件:不是直接作为 Jar-within-a-Jar,而是通过将其所有类放入您的包中,只需在您的Private-Package BND directive 另一个 Jar 提供的包应该包含在你的包中。或者,您可以在 Export-Package 指令中提及这些包,以将它们都包含在和中。
【讨论】:
您的bnd 描述符中需要两条指令。首先使用 Include-Resource 将目标 JAR 包含到您的包中:
Include-Resource: foo.jar
然后您需要指定 foo.jar 需要位于 bundle 类路径中。我假设包内容本身也需要成为包类路径的一部分,所以我们也需要用一个点来包含它:
Bundle-ClassPath: ., foo.jar
请注意,@seh 关于使用 Private-Package 将 JAR 包放入您的包中的答案也是正确的(在这种情况下,JAR 需要在构建时类路径中可见)。不过,我永远不会为此使用Export-Package,因为我认为捆绑包应该严格控制它们的导出量。
【讨论】:
Private-Package: javax.* 这样的傻事,我会将大部分 JRE 包含在我的包中!但是如果我说Private-Package: org.some.library.*,那么我只会得到org.some.library 包如果它们在类路径上。
Bundle-Classpath 标头,从未使用过它。作为参考,它在 OSGi 核心规范 v4.3 的第 3.2.1.4 节中有描述。