私有包清单标题有什么作用?

时间:2012-11-22 13:49:06

标签: java osgi bnd

我熟悉Import-PackageExport-Package,但对我来说这是一个新的。它做了什么?

3 个答案:

答案 0 :(得分:14)

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

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

自动生成

Private-Package的文档内容如下:

  

私人套餐

     

包含方法与Export-Package标题相同,唯一的区别是,这些包不会被导出。此标头将复制到清单。如果通过导出和私有包头选择了包,则导出优先。

     

Private-Package = com。*

答案 1 :(得分:12)

如果你知道静态链接是什么,那么你就会理解私有包。否则请继续阅读。

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

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

通常,Private-Package指定包含不应与其他包共享的类的包,即实现类。虽然一般来说它们来自相应的项目,但是在其中使用bnd是完全可以从类路径上的任何其他JAR获取它们。

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

在C世界中,他们有一种称为静态链接的东西。链接程序后,将从库中检索任何未解析的程序并将其添加到目标中。在某种程度上,私人包装是一样的想法。实际上有一个标题条件包,它静态地链接指定的包和它们可传递依赖的任何东西(只要它们属于模式)。

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

如果您是作者,则可以使用-removeheaders删除标头:Private-Package(或使用< _removeheaders>私有包

进行删除)

答案 2 :(得分:3)

事实上,Private-Package不仅仅是不导出包。如果Private-Package中指定的包未在您自己的项目中定义,并且未在Import-Package中导入,则它们会自动内联到您的jar中。因此,这是一种包含非OSGi依赖项的简单方法。但请注意,内联很容易导致类路径问题。