跳到主要内容

JEP 283:在 Linux 上启用 GTK 3

QWen Max 中英对照

概述

启用基于 JavaFX、Swing 或 AWT 的 Java 图形应用程序,以便在 Linux 上使用 GTK 2 或 GTK 3。

目标

  • 默认情况下支持原生 GTK 2,并在必要时向前兼容至 GTK 3。
  • 当系统属性指示时,使用 GTK 3。
  • 在需要 GTK 3 实现互操作性的情况下,如果可以足够早地检测到此需求,则自动启用 GTK 3。
  • 允许现有的应用程序在安装了 GTK 2 或 GTK 3(或两者皆有)的 Linux 系统上无需修改即可运行。

非目标

在 AWT/Swing 和 JavaFX 之间共享动态包装机制。

动机

Java 在 Linux 上目前使用 GTK 2。这引发了几个问题:

  • 有许多使用 GTK 的 Java 软件包,其中包括 AWT/Swing、JavaFX 和 SWT。SWT 已迁移到 GTK 3,尽管可以使用系统属性强制其使用旧版本。这种混合使用不同 GTK 版本的软件包会导致应用程序故障。此问题在基于 SWT 的 Eclipse 中尤为明显,JavaFX 可以与 Swing 或 SWT 共存。

  • 版本可用性:GTK 3 于 2011 年发布,是当前的开发主线。虽然当前常用的 Linux 发行版默认同时提供版本 2 和版本 3,但在 JDK 9 的生命周期内可能不会一直如此。

  • 较新版本的 SWT 可能会放弃对 GTK 2 回退支持标志的支持。

  • 某些应用程序(例如 Java Mission Control)混合使用 JavaFX 和 SWT,并依赖 GTK 2 回退支持标志。

描述

Java 图形界面应该能够同时支持 GTK 2 和 GTK 3。

AWT 和 Swing 当前使用所需 GTK 函数的动态查找,而不是直接与本地库本身链接。

JavaFX 在其他领域已经采用了类似的机制,并且在调用 GTK 时可以在窗口管理代码中采用类似的机制。

这种动态加载机制可以扩展为选择 GTK 2 或 GTK 3,通过包装函数尽可能地隐藏任何显著的编程差异。可能会有一些编程问题需要解决;例如,数据结构的差异或不同的函数。

一个系统属性将被用来影响运行时 GTK 2 或 GTK 3 的选择。默认情况下,该属性将指示使用 GTK 2 以降低风险。如果系统中不存在 GTK 2,则运行时将自动选择 GTK 3。如果运行时能够及时检测到需要使用 GTK 3,例如当 FXCanvas 与 SWT 一起使用时,系统属性将自动设置为 GTK 3。

JavaFX 通过 JFXPanel 与 AWT/Swing 进行交互,并使用 AWT 的功能来支持打印。可以仅在 JavaFX 中实现 GTK 2/3 支持,但这将带来可支持应用程序类型的限制。

AWT/Swing 的主要子任务:

  • 改进现有的动态 GTK 兼容层,以支持 GTK 3。
  • 重构 Swing GTK 外观以支持 GTK-3。
  • FileChooserDialog 同步迁移至 GTK-3。
  • AwtRobot 迁移至 GTK-3(或者可能移除对任何 GTK 的依赖)。
  • 使用现有的自动化测试进行测试,包括 GTK 2 和 GTK 3。

JavaFX 的子任务:

  • 创建一个用于动态加载 GTK 2 的垫片(shim)。
  • 调整动态 GTK 垫片以同时支持 GTK 3。
  • 使用现有的自动化测试进行测试,包括 GTK 2 和 GTK 3。

替代方案

将 Java 图形迁移到仅支持 GTK 3。

优点:

  • 在移植和测试以将现有代码迁移到使用 GTK3 编译时,整体工作量较少。
  • 只有一个测试路径,而不是两个。
  • 未来只有一个代码路径。

缺点:

  • 我们测试未检测到的错误风险更高。
  • 需要额外努力来处理AWT的外观和感觉。
  • 目标系统上需要安装GTK 3二进制文件(这种需求有些不太可能)。
  • 将需要同时移植JavaFX和AWT/Swing,或者都不移植;不可能放弃其中一个子项目还能交付另一个。
  • 移植将需要AWT和Swing之间更大程度的协调。

测试

应使用 Linux 上现有的 Java 系统测试。

至少应该在一次或多次测试运行中使用(强制)非默认路径(GTK 3),以验证所有通过的测试仍然能够通过。

风险与假设

所提出解决方案的主要风险在于,测试无法发现将会引入的新错误。AWT 使用了更多的特性,因此可能会由于 GTK 行为更改而引入新错误的风险较高。

由于不可预见的技术困难,AWT/Swing 子任务或 JavaFX 子任务可能无法按时完成,存在一定的风险。

如果 AWT/Swing 无法完成,那么这将对 JavaFX 造成运行时限制,但仅限于混合使用两者的应用程序。主要影响的是那些使用 JFXPanel 或进行打印操作的应用程序。

如果无法完成 JavaFX,那么对于混合使用 JavaFX 和 SWT(FXCanvas)的应用程序来说,将会出现运行时问题。