【问题标题】:What Does "Export-Package: ." Mean?“导出包:.”是什么意思?意思是?
【发布时间】:2018-07-17 14:14:19
【问题描述】:

想象一个带有包 org.acme.foo.bar 的 Eclipse 插件(分别是 OSGi 包)。

可以导出“.”例如请参阅以下 MANIFEST.MF sn-p:

Export-Package: .,
 org.acme.foo.bar

编译器对此没有任何问题,因此它似乎是合法的导出。

它有什么作用?跟下面的(“.”未导出)有什么区别?

Export-Package: org.acme.foo.bar

【问题讨论】:

    标签: eclipse osgi eclipse-rcp osgi-bundle manifest.mf


    【解决方案1】:

    .默认包 但根据 OSGi Core, Release 6 specification . 不是 Export-Package 的有效值,因为包名称必须以一封信:

    Export-Package ::= export ( ',' export)*
    export ::= 包名 ( ';' 参数 )*
    包名 ::= 包名 ( ';' 包名 )*
    包名 ::= 唯一名称
    唯一名称 ::= 标识符('.'标识符)*
    标识符 ::= jletter jletterordigit *
    jletter ::= Java Language Specification Third Edition for JavaLetter>
    jletterordigit ::= Java Language Specification Third Edition for JavaLetterOrDigit>

    因此最好不要使用默认包:

    Export-Package: org.acme.foo.bar
    

    【讨论】:

    • 正确,只是它不依赖于所使用的 OSGi 框架。在所有符合规范的框架实现下,导出默认包都是错误的。
    • @NeilBartlett 感谢您的澄清。我相应地编辑了我的答案。这是否意味着忽略. 或不存在的包并将. 解释为默认包违反了规范?规范是否允许非导出的默认包?
    • . 是一个无效的包名。默认包没有名称,当然也不能从包中导入或导出。
    【解决方案2】:

    虽然 Eclipse MANIFEST.MF 验证允许使用 '.'根据 OSGi 规范,它是无效的。好像是默认包的意思,但这不是一个明智的导出方式。

    这似乎得到了 Eclipse 错误366800 的证实,该错误报告使用了“.”。像这样在'org.eclipse.datatools.sqltools.parsers.sql.query'插件中。该错误被接受为错误和“。”删除。

    【讨论】:

    • . 是默认包(应该避免),并且在错误添加到不包含默认包的插件/包中的引用错误中。您确定 OSGi 规范不允许将默认包指定为导出包吗?
    • 好的,所以这似乎是 Eclipse 特定的,并且似乎没有多大意义。
    • 我不认为 . 是 Eclipse 特定的(例如,请参阅 "default package '.'" here),但我同意使用默认包是丑陋的,并且可能不在 OSGi 规范中。
    【解决方案3】:

    在 OSGi 规范 (V6) 中找不到它。

    在 Eclipse (Oygen.2) 中尝试了一个示例。创建了两个插件(也称为捆绑包),一个“提供者”,另一个“消费者”。 Provider 导出默认包,并且在该包中包含一个公共 A 类。

    => 无法从插件“提供者”访问 A。 Eclipse 建议导出包''。调用该选项不会改变任何内容。编译错误仍然存​​在。

    我建议不要使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      相关资源
      最近更新 更多