【问题标题】:Whats the deal with private packages?私人包裹的处理方式是什么?
【发布时间】:2012-12-02 10:22:59
【问题描述】:

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

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

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

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

【问题讨论】:

标签: java module osgi


【解决方案1】:

没有区别。

Export-Package 中未列出的任何包都是私有的.... 仅此而已。

可能看到了另一个名为 Private-Package 的标题。这不是 OSGi 标头,它被 OSGi 框架完全忽略。如果您看到此信息,则表明已使用 bndMaven Bundle Plugin 构建了一个捆绑包,它使用此标头具有构建时指令。因此它只在构建时相关,在运行时没有任何影响。

【讨论】:

    【解决方案2】:

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

    如果你的清单是由 maven-bundle-plugin 生成的,那么这个术语 get 更相关一些,因为 maven bundle 插件将默认导出所有包,除了一个名为 internal 的包(或子包)。这在某种程度上是相反的方法,因为您指定了私有包并计算了导出的包。详情请见the maven bundle plugin

    【讨论】:

    • 未包含在“导出包”中的包不是私有的,它们是被禁止的。它们不能也不会用于其他捆绑包。另一方面,私有包必须包含在“导出包”中,但应该在众所周知的包中内部使用,并且编译器不鼓励使用它。如果您使用它们并在严格模式下运行 OSGi,它们将不可用,就好像它们没有被导出一样,您会得到 classNotFound 异常。
    • 这对于纯 OSGi 是不正确的。 The OSGi core specification (R5) 明确指出(第 3.7.1 节):未导出或导入的包称为私有包。
    • @Behnil 的评论不准确。例如:“私有包必须包含在导出包中”显然是错误的,如果它们包含在导出中,那么它们就不是私有的!此外,OSGi 没有“严格模式”之类的东西。
    • 好的,我发布的所有内容都是为了具体的 OSGi 实现 - Eclipse Equinox。所以我很抱歉造成混淆。 Equinox 中的私有包必须包含在导出的包中,因为这里的私有意味着内部。正如我在上面发布的那样,您所说的私人是在春分禁止的。至于严格模式,还有一些资料aniszczyk.org/2008/03/06/osgi-equinox-and-strict-mode
    • @Benhil:您所指的概念不使用“私人”。正如其他人所说,OSGi 将术语定义为(包含的包 - 导出的包)。
    猜你喜欢
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多