2012-12-14 46 views
21

我一直在OSGi工作了一段时间,但我仍然不明白有关私人包的信息。什么是私人包裹的交易?

  • 导出的包是与对其它束
  • 导入的包装可见的封装是由束导出包导入的包。
  • 私人包是一个包,是不可见的其他包(我不明白这一点)

难道这不导出不可见的所有其他的包都捆绑包?如果是这样,私人包裹和包裹不会被输出的区别是什么?

我读过OSGi的行动和“OSGi和Apache费利克斯3.0 - 初学者指南”,但我无法找到差异。

+0

你究竟在哪里遇到“私人包装”的概念?它在哪里配置?我相信这不是manifest.mf的一个特征。 –

+2

请参阅http://stackoverflow.com/questions/13514123/what-does-the-private-package-manifest-header-do以及 – btiernay

回答

14

是的,没有在manifest.mf条目Export-Package中定义的所有包都是私有包。您不需要单独指定它们,这只是便于沟通的另一个术语。

如果你有你的清单产生,例如maven-bundle-plugin,这个术语会变得更相关,因为maven bundle插件将默认导出所有包,例如一个名为internal(或那个子包)。由于您指定了私有包并且计算了导出的包,这在某种程度上是逆向的方法。详情请参阅the maven bundle plugin

+2

“Export-package”中未包含的软件包不是私有的,它们被禁止。他们不能也不会被其他包使用。另一方面,私有包必须包含在“导出包”中,但是应该在公知的包内部使用,其使用大多是编译器不喜欢的。如果您使用它们并以严格模式运行OSGi,那么它们将不可用,就好像它们未被导出一样,您将得到classNotFound异常。 – Behnil

+2

对于纯OSGi而言,这并非如此。 [OSGi核心规范(R5)](http://www.osgi.org/Specifications/HomePage)明确指出(第3.7.1节):_未导出或导入的包被称为私有包._ – benjamin

+3

@Behnil不准确。例如:“私人包裹必须包含在出口包裹”显然是错误的,如果他们包含在出口,那么他们不是私人的!另外,OSGi没有像“严格模式”这样的东西。 –

23

没有区别。

没有在Export-Package中列出的任何包是私人的....这就是它的全部。

可能已经看到另一个标头Private-Package。这不是OSGi头,它完全被OSGi框架忽略。如果您看到这一点,则表示已使用bndMaven Bundle Plugin构建了一个包,该包使用此标头具有构建时指令。因此,它只与构建时相关,并且在运行时没有任何影响。