Ant 使用BND嵌入第三方JAR

Ant 使用BND嵌入第三方JAR,ant,osgi,apache-felix,bnd,Ant,Osgi,Apache Felix,Bnd,我有一个OSGi包,它是使用ANT和经典的BND工具构建的。我的bundle在内部使用了一个库(JAR),它在我的OSGi容器(apachefelix)中不能作为bundle使用。因此,我试图将其嵌入我的bundle,以便在运行时访问 如何使用ANT+BND嵌入这样的库/JAR? (注意:我不能使用MAVEN,使用它可能会容易得多)有一个BND提供的Ant任务,名为。它没有很好的记录。当我尝试使用它时,我必须阅读它,看看它在做什么。(另请参见。) 我记得,也可以用另一种方式“嵌入”依赖于Jar的

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

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

有一个BND提供的Ant任务,名为。它没有很好的记录。当我尝试使用它时,我必须阅读它,看看它在做什么。(另请参见。)


我记得,也可以用另一种方式“嵌入”依赖于Jar的文件:不是直接作为Jar-in-a-Jar,而是通过将其所有类slurp到包中,只需在包中声明其他Jar提供的包应该包含在您的包中。或者,您可以在
Export Package
指令中提及这些包,以将它们包括在内并导出。

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

Include-Resource: foo.jar
然后您需要指定foo.jar需要位于bundle类路径上。我假设bundle内容本身也需要是bundle类路径的一部分,因此我们还需要将其包含在一个点中:

Bundle-ClassPath: ., foo.jar

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

“需要在构建时类路径上可见”-这到底意味着什么?你能再亮一点吗?谢谢。这意味着它需要位于提供给ANT任务的类路径上。Bnd从构建类路径中提取包,它并不真正关心它们是第三方包还是您的代码。例如,如果我做了一些愚蠢的事情,比如
Private-Package:javax.*
我会在我的包中包含大部分JRE!但是如果我说
Private Package:org.some.library.*
那么我只会得到
org.some.library
包,如果它们在类路径上。我不知道
Bundle类路径
头,从来没有使用过它。作为参考,OSGi核心规范v4.3第3.2.1.4节对此进行了描述。