私有包清单头是用来做什么的?

15

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

3个回答

18

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

但是,可以在.bnd文件中指定它以供bnd在构建时使用。如果这样做,它可以用于确定bundle中包含哪些内容。 当bnd构建一个bundle时,它会自动确定哪些类需要加入到bundle中。所有导出的包中的类都会被包括在内,它们所依赖的所有类(传递性地)也会被包括在内。这意味着,如果一个类似乎没有被使用,那么它就不会被包含在bundle中。然而,您可以使用Private-Package指令告诉bnd将包的内容包含在bundle中,即使它似乎没有被使用。如果未指定Private-Package指令,则bnd会自动生成该指令。

Private-Package文档如下:

私有包

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

Private-Package= com.*


13
如果您了解什么是“静态链接”,那么您就理解了Private-Package。否则,请继续阅读。
Private-Package 是 bnd 告诉你必须在 jar 内部但未被导出的包。它不是 OSGi 头文件,而是一个 bnd 的“指令”。
该指令定义了必须包含在 JAR 中的来自类路径(带通配符)的包。bnd 独特之处在于它从规范中填充 JAR 而不是像大多数构建工具一样从某个目录。原因是除非模块被“设计”并且它们的布局经过认真考虑,否则它们很少提供模块化的好处。
一般而言,Private-Package 指定了持有不应与其他 bundle 共享的类(即实现类)的包。尽管它们通常来自使用 bnd 的相应项目,但从类路径上的任何其他 JAR 获取它们也是完全可以接受的。
其中一种用例是具有 utils 的库。将 util 库转换为 bundle 通常会对依赖关系造成巨大破坏,因为 utils 往往依赖于许多不相关的东西;你使用一个小方法,突然间就拉入了 30Mb 的依赖项。bnd 本身大量使用此模型与 aQute.lib* 包,来自此库的包永远不应该被导出。这是包大小和“下载互联网”之间的权衡。Eclipse 和 Apache Felix 的世界之间的差异是明显的。Apache Felix bundles 通常是独立的,并不需要各种支持和 util bundles,而 Eclipse 的 bundles 则倾向于需要大量的 plumbing bundles。我认为这种差异在很大程度上是由于 Eclipse 的 PDE 所致,它使得无法包含来自其他项目的包,除非您复制源代码,这当然是大忌。
在 C 世界中,他们有一个叫做静态链接的东西。在链接程序之后,任何未解决的问题都将从库中检索并添加到目标文件中。 Private-Package 在某种程度上就是同样的思想。实际上还有一个头文件 Conditional-Package,它会静态链接指定的包及其传递依赖项(只要它们符合模式)。最终bnd会显示未在清单文件的Private-Package头部导出的扩展包。毕竟,清单文件应该描述其内容...
如果您是作者,可以使用-removeheaders: Private-Package(或在Maven中使用<_removeheaders>Private-Package)来删除此头部。

我可以问一下为什么BND不将所有未导出的类“私有化”吗?如果您在项目中有一个类,那是因为您需要它;所以如果它没有被导出,那么它不应该是私有的吗?换句话说,什么情况下不会同时使用Export-Package和Private-Package? - Hilikus
1
您必须指定私有包,因为bnd不会假设所有来自src目录的类都应该被包含在内,所以没有范围可以允许减去导出的包。bnd类路径上的任何包都可以包含在bundle中,无论是私有还是导出的。这样,bnd可以从单个项目构建多个bundle,这与大多数构建环境不同。它还允许导出由bundle提供的API包,即使它们来自另一个bundle/jar。 - Peter Kriens

5
实际上,Private-Package 不仅仅是不导出一个包。如果在 Private-Package 中指定的包没有在您自己的项目中定义,并且没有在 Import-Package 中导入,则它们会自动嵌入到您的 JAR 文件中。因此,这是一种包含非 OSGi 依赖项的简单方法。但要小心,内联可能很容易导致类路径问题。

如果OSGi R7文档明确提到了包含非OSGi包的“简单”方法,而不是让人们费尽心思去弄清楚,那将是很棒的。它只是在3.7.1图表和语法下说:“未导出或导入的包称为私有包。” - Jonathan Komar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接