链接器

链接器子系统负责编写 GWT 编译器的输出。它负责每个输出文件的名称、位置和内容。

在编译器内部,每个输出文件都由一个 Artifact 表示。

通常您不需要关心它们,除非您有特殊要求。

链接器创建多种类型的文件(参见 EmittedArtifact.Visibility)

  • **公共文件** 是那些打算被 Web 浏览器下载的文件。这包括 JavaScript 和其他资源文件。
  • **源文件** 仅在开发期间提供给浏览器。这包括 Java 源代码和浏览器调试器使用的源映射。
  • **部署文件** 应用程序服务器可能需要它们,但不能提供给浏览器。
  • **私有文件** 包含关于编译过程中发生的事情的各种可选报告。Soyc 报告就是一个例子。
  • 还有一些非发射工件,它们用于将数据从一个链接器传递到另一个链接器,但不会作为输出写入。

链接器分为三类

  • **预链接器** 在主链接器之前运行,按照其名称的字典顺序。
  • **主链接器** 是主要的链接器。每次编译只运行一个主链接器。
  • **后链接器** 在主链接器之后运行,按照其名称的逆字典顺序。

要使用 Linker,只需将 <add-linker name="linker_name" /> 添加到您的 Module.gwt.xml 文件中

<module>
  <inherits name="com.google.gwt.core.Core" />
  <add-linker name="sso" />
</module>

或者您也可以继承另一个模块,该模块为您添加链接器。

此标记对于预链接器和后链接器是累加的;只运行最后一个主链接器。如果未指定,则 xsiframe 链接器为默认链接器。

可用链接器

请参阅每个链接器的文档以检查如何使用它。

定义了以下 主链接器

  • xsiframe(类 CrossSiteIframeLinker):此链接器使用一个 iframe 来保存代码,并使用一个脚本标签来下载代码。如果未指定链接器,则为默认链接器。
  • direct_install(类 DirectInstallLinker):一个直接将脚本标签添加到 iframe 的链接器。
  • sso(类 SingleScriptLinker):一个从 GWT 模块生成单个 JavaScript 文件的链接器。

以下链接器已弃用

  • xs:改用 xsiframe
  • std:改用 xsiframe

自定义链接器

如果您有现有链接器无法满足的特定需求,您可以创建和使用自定义链接器。

首先,实现您的链接器。它必须是一个扩展 Linker 抽象类(检查其文档)或 AbstractLinker 的类。

使用 @LinkerOrder 注解,您可以指定它是预链接器、后链接器还是主链接器。您还必须用 @Shardable 注解对其进行注释。

其次,通过将 <define-linker name="short_name" class="fully_qualified_class_name" /> 放入您的 Module.gwt.xml 文件中来注册您的链接器。name 属性必须是有效的 Java 标识符,并用于在 <add-linker> 标记中识别链接器。

允许通过声明一个具有相同名称的新 <define-linker> 标记来重新定义已定义的链接器。

然后,您可以像使用任何其他链接器一样使用您的链接器,使用 <add-linker>

内部链接器

为了参考,这里还有一些 GWT 使用的其他链接器。它们不是 GWT 公共 API 的一部分,您不应该直接引用它们。

定义了以下 预链接器

  • rpcPolicyManifest(类 RpcPolicyManifestLinker):发出一个文件,其中包含一个 RPC 代理类到 RPC 策略文件的相对路径的映射。对于使用 GWT-RPC 的应用程序,它会自动打开。

定义了以下 后链接器

  • soycReport(类 SoycReportLinker):将 SOYC 报告文件转换为发出的私有工件。此链接器默认启用,但 SOYC 报告本身默认关闭,并通过 -soyc 编译器标志启用。如果编译器不生成报告,则此链接器不会执行任何操作。
  • symbolMaps(类 SymbolMapsLinker):此链接器将与每个编译结果相关的符号映射导出为私有文件。此链接器默认启用。
  • rpcLog(类 RpcLogLinker):此链接器发出 RpcLogArtifact` 作为输出文件。对于使用 GWT-RPC 的应用程序,它会自动打开。
  • precompress(类 PrecompressLinker):一个预压缩它看到的公共工件的链接器。通过继承 com.google.gwt.precompress.Precompress 来使用它。