我有一个使用 ANT 和经典 BND 工具构建的 OSGi 包。我的包在内部使用了一个库 (JAR),它不能作为我的 OSGi 容器 (Apache Felix) 中的包使用。所以,我试图将它嵌入到我的 bundle中,以便在运行时访问。
如何使用 ANT+BND 嵌入这样的库/JAR?(注意:我不能使用 MAVEN,使用它可能会容易得多)
我有一个使用 ANT 和经典 BND 工具构建的 OSGi 包。我的包在内部使用了一个库 (JAR),它不能作为我的 OSGi 容器 (Apache Felix) 中的包使用。所以,我试图将它嵌入到我的 bundle中,以便在运行时访问。
如何使用 ANT+BND 嵌入这样的库/JAR?(注意:我不能使用 MAVEN,使用它可能会容易得多)
您的bnd
描述符中需要两条指令。首先用于Include-Resource
将目标 JAR 包含到您的包中:
Include-Resource: foo.jar
然后,您需要指定 foo.jar 需要位于 bundle 类路径中。我假设包内容本身也需要成为包类路径的一部分,所以我们也需要用一个点来包含它:
Bundle-ClassPath: ., foo.jar
请注意,@seh 关于将 JAR 的包放入您的包中的答案Private-Package
也是正确的(在这种情况下,JAR 需要在构建时类路径上可见)。不过我永远不会使用Export-Package
这个,因为我认为捆绑包应该严格控制它们的导出量。
有一个 BND 提供的 Ant 任务,称为“bndwrap”。它没有很好的记录。当我尝试使用它时,我不得不阅读Java 代码以了解它在做什么。(参见这里的bnd#doWrap()
方法。)
我记得也可以通过另一种方式“嵌入”一个依赖的 Jar 文件:不是直接作为 Jar-within-a-Jar,而是通过将其所有类放入包中,只需在Private-Package
BND 指令中声明另一个 Jar 提供的包应该包含在你的包中。或者,您可以在指令中提及这些包,以Export-Package
包含和导出它们。