私有包是什么意思?

29

我已经使用OSGi工作了一段时间,但我仍然不太理解私有包。

  • 导出包是可见于其他捆绑包的包
  • 导入包是由导出该包的捆绑包导入的包。
  • 私有包是对其他捆绑包不可见的包(我不明白这个)

难道所有未导出的捆绑包都对所有其他包不可见吗?如果是这样,那么私有包和未导出的包有什么区别?

我阅读了《OSGi in Action》和《OSGi和Apache Felix 3.0-初学者指南》,但我找不到区别。


你在哪里遇到了“私有包”这个概念?它在哪里进行配置?我相信它不是 manifest.mf 的一个功能。 - Marko Topolnik
2
请查看https://dev59.com/yGYr5IYBdhLWcg3wpLr9 - btiernay
2个回答

28

没有区别。

任何未列在Export-Package中的软件包都是私有的...这就是全部内容。

您可能已经看到了另一个名为Private-Package的头部。这不是 OSGi 头,并且 OSGi 框架会完全忽略它。如果您看到它,那么表示一个捆绑已经使用 bnd 或者 Maven Bundle Plugin 构建,使用此标头作为构建时指令。因此,它仅适用于构建时,对运行时没有任何影响。


21

是的,所有未在manifest.mf条目Export-Package中定义的包都是私有包。您无需单独指定它们,这只是为了便于沟通而使用的另一个术语。

如果您的清单例如通过maven-bundle-plugin生成,则此术语变得更加相关,因为maven bundle插件将默认导出所有包,除了例如名为internal(或其子包)的包。这是一种相反的方法,因为您需要指定私有包并计算导出的包。有关详细信息,请参见maven bundle插件


2
没有包含在“Export-package”中的包不是私有的,它们是被禁止的。它们不能被其他捆绑包使用。另一方面,私有包必须包含在“Export-package”中,但是应该只在已知的捆绑包内部使用,并且编译器大多数情况下会阻止其使用。如果您使用它们并在严格模式下运行OSGi,则它们将不可用,就好像它们没有被导出一样,并且您会收到ClassNotFound异常。 - Jan Krakora
2
这并不适用于纯OSGi。《OSGi核心规范(R5)》明确指出(第3.7.1节):未导出或导入的包被称为私有包。 - benjamin
3
@Behnil的评论不准确。比如说:“私有包必须包含在导出包中”显然是错误的,如果它们被包含在导出包中,那么它们就不是私有的了!此外,OSGi没有所谓的“严格模式”。 - Neil Bartlett
好的,我发布的所有内容都是针对OSGi实现 - Eclipse Equinox的。所以我很抱歉造成了困惑。在Equinox中,私有包必须包含在导出包中,因为私有意味着内部。而你所说的私有,在Equinox中是被禁止的,就像我上面发布的那样。至于严格模式,这里有更多信息:http://aniszczyk.org/2008/03/06/osgi-equinox-and-strict-mode/。 - Jan Krakora
@Benhil:你所提到的概念并没有使用“private”。正如其他人所说,OSGi将该术语定义为(包含的包-导出的包)。 - Peter Kriens

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