访问限制

Eclipse 3.1 运行时为插件开发者提供了选项来逐个包地控制插件代码对下游插件的可视性。

可以将包归类到下列其中一类:

  1. 可访问
  2. 被禁止
  3. 内部
  4. 内部,带有友元

编译时,PDE 将这些运行时可视性规则转换为编译器访问限制规则。因此,编译器根据可视性规则违例严重性的不同将该违例标记为警告或错误。

由于在编译时提供了此项支持,所以开发者将永远不会因为运行时发生类装入错误而吃惊,并且他总是知道什么时候引用了内部类型。

 

可访问的包

可访问的包无条件地对下游插件可视。虽然必须明确将 API 包归为此类别,但应该完全由开发者决定对插件导出的哪些其它包指定此可视性级别。  

为了将包声明为可访问,您必须将其列示在插件清单编辑器的运行时上的已导出的包部分中,并且保持缺省可视性设置不变。

可访问的包

 

被禁止的包

通过从插件清单编辑器的运行时页面上的已导出的包部分中的列表中排除一个包,可以使该包对下游插件永远隐藏起来。

对被禁止的包中的类型进行引用将导致运行时发生类装入错误。

要避免发生此类不良情况: 

  1. 编译器使用 ERROR 来标记对被禁止的包的引用。
  2. 在内容辅助中,不提供被禁止的包中的类型作为建议项。

注意:

  1. Eclipse SDK 中的所有插件都在“已导出的包”部分中列出它们所有的包。因此,SDK 中的任何包都不是禁止访问的。
  2. 被禁止的引用的严重性级别是在 Java > 编译器 > 错误/警告 > 不建议使用的和受限制的 API 首选项页面上设置的。

    强烈建议您将被禁止的引用的严重性设置为 ERROR。

    被禁止首选项

内部包

内部包是不打算提供给下游插件使用的包。缺省情况下,这些包对下游插件可视。

仅当以 strict 模式启动 Eclipse(即,启动时指定了 -Dosgi.resolverMode=strict VM 自变量)时,内部包才会对下游插件隐藏起来。

内部包必须列示在插件清单编辑器的运行时页面上的已导出的包部分中并选择了隐藏选项。

不鼓励的访问

利用了两种措施来不鼓励下游插件引用内部包:

不鼓励的访问

不鼓励的内容辅助

可以在 Java > 编译器 > 错误/警告 > 不建议使用的和受限制的 API 首选项页面上设置不鼓励的引用的严重性级别。

不鼓励的首选项

 

内部包,带有友元

插件能够将其内部包的完全访问权授予指定的“友元”插件,这一点十分重要。例如,PDE 代码包含在多个插件中,那么 org.eclipse.pde.ui 插件应该对 org.eclipse.pde.core 的内部包具有完全访问权。

在以下示例中,友元(org.eclipse.pde 和 org.eclipse.pde.ui 插件)对 org.eclipse.pde.core 插件中的 org.eclipse.pde.internal.core.bundle 包具有完全访问权。

友元

编译器允许友元自由地对 org.eclipse.pde.internal.core.bundle 包中的任何类型进行引用。

另一方面,如果任何其它插件对 org.eclipse.pde.internal.core.bundle 包中的类型进行引用,编译器就会将该引用标记为不鼓励的引用,如上一节所述。

 

如何启用访问限制

要利用 PDE 的访问限制支持,唯一的要求是要处理的插件包含 OSGi bundle manifest.mf。剩下的工作由管理插件类路径的 PDE 处理。

如果插件未包含 manifest.mf 文件,则可以按照以下方式创建该文件:

  1. 在插件清单编辑器中打开 plugin.xml。
  2. 在概述页面的插件内容部分中,单击“创建 OSGi bundle 清单”链接。

转换为 manifest.mf

 

检查访问规则

可以在插件项目的 Java 构建路径属性页面上检查 PDE 对每个类路径条目施加的访问限制规则。

Java 构建路径属性