2012-11-22 33 views

回答

13

在OSGi容器运行时,它什么都不做。事实上,它甚至没有在OSGi规范中提到过(我检查过R4)。

但是,它可以在构建时由bnd使用的.bnd文件中指定。如果是这样,它可以用来确定进入捆绑包的内容。 当bnd构建一个包时,它会自动确定哪些类需要进入包中。包含所有导出的包中的类都包含在内,并且它们所依赖的所有类(传递式)也包含在内。这意味着如果一个类似乎没有被使用,那么它将不会被包含在该包中。但是,您可以使用Private-Package指令告诉bnd将软件包的内容包含在软件包中,即使它看起来未被使用。如果未指定Private-Package指令,则它将由bnd自动生成。

Private-Package的文档的内容如下:

私人包

夹杂物的方法是相同的导出-Package头,唯一的区别是,是,这些包不出口。这个头文件将被复制到清单中。如果通过noth选择了一个包,则导出优先。

私营包= COM。*

3

其实私募套餐并不仅仅是没有导出包的更多。如果Private-Package中指定的包没有在您自己的项目中定义并且没有导入到Import-Package中,那么它们会自动内联到您的jar中。所以这是包含非OSGi依赖关系的简单方法。请小心,但内联很容易导致类路径问题。

11

如果你知道什么静态链接然后你明白私人包装。否则继续阅读。

Private-Package是bnd的方式,告诉你必须在jar中但不导出的包。它是而不是一个OSGi头,但一个bnd'指令'。

该指令定义了必须包含在JAR中的类路径中的包(带有通配符)。 bnd是独一无二的,它从规范中填充JAR,而不是像大多数构建工具那样的目录。原因是,除非模块是“设计好的”,并仔细考虑了它们的布局,否则它们很少提供模块化的优势。

通常,Private-Package指定包含不应与其他包(即实现类)共享的类的包。尽管通常它们来自bnd所用的相应项目,但在类路径中从任何其他JAR获取它们是完全可以接受的。

一个用例是一个带有utils的库。在一个bundle中转换一个util库通常会对依赖造成严重破坏,因为utils往往依赖于很多不相关的东西;你使用一种微小的方法,突然你拖入30Mb的依赖关系。 bnd本身在aQute.lib *包中大量使用此模型,因此不应该导出此库中的包。这是一个捆绑规模和'下载互联网'之间的交易。Eclipse和Apache Felix的世界之间可以区别。 Apache Felix捆绑包通常是独立的,不需要各种支持和util捆绑包,而Eclipse的捆绑包往往需要大量的管道捆绑包。我认为这种差异很大程度上是由Eclipse的PDE引起的,它使得包含其他项目的软件包成为不可能,除非您复制源代码当然是一个很大的禁忌。

在C世界里他们有一种叫做静态链接的东西。链接程序后,任何未解决的问题将从库中检索并添加到目标中。在一定程度上私人包装是相同的想法。实际上有一个头条件包,它静态地链接指定的包和它们传递依赖的任何东西(只要它们落入模式中)。

最后,bnd显示未在清单中的Private-Package标头中导出的扩展包。毕竟,清单应该描述的内容...

如果您是作者,您可以删除与-removeheaders头:与< _removeheaders私人封装(或行家>私营包

+0

请问为什么BND不“私人包装”所有的非出口类?如果你的项目中有一个类,那是因为你需要它;所以如果它没有出口,它不应该是私人的。的话,你什么时候不需要导出包或者私有包 - 一个包? – Hilikus

+1

你必须指定私有包,因为bnd并不假定所有来自src目录的类都应该包含在内,所以没有范围允许减少导出软件包。bnd的类路径上的任何软件包都可以包含在软件包中遗弃或出口。这样,bnd可以从一个单独的项目中构建多个bundle,这与大多数构建环境不同。它还允许导出包提供的API包,即使它们来自另一个包/ jar。 –