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

2022-09-03 09:39:28

我很熟悉 和 ,但这对我来说是一个新的。它有什么作用?Import-PackageExport-Package


答案 1

在OSGi容器的运行时,它不执行任何操作。事实上,它甚至没有在OSGi规范中提到(我检查了R4)。

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

私有包的文档如下所示:

私人套餐

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

Private-Package = com.*


答案 2

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

Private-Package 是 bnd 告诉你哪些包必须在 jar 中,但未导出。它不是一个OSGi头文件,而是一个bnd“指令”。

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

一般而言,Private-Package 指定保存不应与其他捆绑包共享的类的包,即实现类。虽然一般来说,它们来自bnd使用的相应项目,但从类路径上的任何其他JAR获取它们是完全可以接受的。

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

在C世界中,它们有一种叫做静态链接的东西。链接程序后,将从库中检索任何未解析的内容并将其添加到目标中。在某种程度上,私有包也是同样的想法。实际上有一个标头条件包,它静态链接指定的包以及它们传递依赖的任何内容(只要它们属于模式)。

最后,bnd 显示了清单中私有包标头中未导出的展开包。毕竟,清单应该描述内容...

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


推荐