“Export-Package: .” 是什么意思?

3

想象一下一个名为org.acme.foo.bar的包含在Eclipse插件(或OSGi Bundle)中。

可以通过以下MANIFEST.MF片段来导出“.”:

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

编译器没有问题,所以这似乎是一个合法的导出。它是做什么的?与以下内容(未导出“.”)有何区别?
Export-Package: org.acme.foo.bar
3个回答

6

.默认包,但根据OSGi Core, Release 6 specification.不是Export-Package的有效值,因为包名必须以字母开头:

导出包 ::= 导出 (',' 导出)*
导出 ::= 包名 (';' 参数 )*
包名 ::= 包名称 (';' 包名称 )*
包名称 ::= 唯一名称
唯一名称 ::= 标识符 ('.' 标识符 )*
标识符 ::= jletter jletterordigit *
jletter ::= <见Java语言规范第三版的JavaLetter>
jletterordigit ::= <见 Java语言规范第三版的JavaLetterOrDigit>

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

Export-Package: org.acme.foo.bar

1
正确的做法是不依赖于所使用的OSGi框架。在所有符合规范的框架实现中,导出默认包都是一个错误。 - Neil Bartlett
@NeilBartlett 谢谢您的澄清。我已相应地编辑了我的答案。这是否意味着忽略 . 或不存在的包并将 . 解释为默认包违反了规范?规范允许非导出的默认包吗? - howlger
“.” 是无效的包名。默认包没有名称,当然也不能从捆绑包中导入或导出。 - BJ Hargrave

3
尽管Eclipse MANIFEST.MF验证允许'.',但它不符合OSGi规范。它似乎表示默认包,但导出这样的包并不明智。根据Eclipse bug 366800 的报告,'org.eclipse.datatools.sqltools.parsers.sql.query'插件中使用了'.',这似乎已经得到确认。该错误已被接受并删除了'.'。

1
“.” 是默认包(应该避免使用),在引用的错误中,它被错误地添加到不包含默认包的插件/捆绑包中。您确定 OSGi 规范不允许将默认包指定为导出包吗? - howlger
好的,这似乎是特定于Eclipse的,而且并没有太多意义。 - greg-449
我认为“.”不是Eclipse特有的(例如,在此处可以看到“default package '.'”(http://felix.apache.org/documentation/subprojects/apache-felix-maven-bundle-plugin-bnd.html)),但我同意使用默认包很丑陋,也可能不符合OSGi规范。 - howlger

1

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

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

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

我建议不要使用这个。


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