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

Mid*_*hat 13 java osgi bnd

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

Mar*_*lis 14

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

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

Private-Package的文档内容如下:

私人套餐

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

Private-Package = com.*


Pet*_*ens 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引起的

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

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

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


Chr*_*der 5

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