Skip to content

JEP 283: Enable GTK 3 on Linux | 在 Linux 上启用 GTK 3

摘要

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

目标

  • 默认情况下支持本机 GTK 2,并向前兼容到 GTK 3。
  • 当系统属性指示时,使用 GTK 3。
  • 在需要与其他系统进行交互性时,且可以足够早地检测到此需求时,自动启用 GTK 3。
  • 允许现有应用程序在安装了 GTK 2 或 GTK 3 的 Linux 系统上运行而无需修改。

非目标

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

动机

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

  • 有许多 Java 软件包使用了 GTK。其中包括 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 函数的动态查找,而不是直接与本地库进行链接。

当调用 GTK 时,JavaFX 在其他领域也采用了类似的机制。

这种动态加载机制可以扩展到选择 GTK 2 或 3,尽可能隐藏任何重大的编程差异,并通过包装函数来处理这些差异。很可能会存在一些需要解决的编程问题,例如数据结构的差异或不同的函数。

系统属性将被用于在运行时影响选择 GTK 2 或 3。默认情况下,此属性将指示 GTK 2 以减少风险。如果系统上不存在 GTK 2,则运行时将自动选择 GTK 3。如果运行时可以及时检测到需要使用 GTK 3 的情况,例如在与 SWT 一起使用 FXCanvas 时,系统属性将自动设置为 GTK 3。

JavaFX 通过 JFXPanel 与 AWT/Swing 进行交互,并使用 AWT 功能进行打印支持。在 JavaFX 中只实现 GTK 2/3 支持是可能的,但对于可以支持的应用程序类型会有限制。

AWT/Swing 的主要子任务:

  • 使现有的动态 GTK shim 支持 GTK 3。
  • 重新设计 Swing GTK LnF 以支持 GTK-3。
  • FileChooserDialog peer 迁移到 GTK-3。
  • AwtRobot 迁移到 GTK-3(或者可能消除对任何 GTK 的依赖)。
  • 通过现有的自动化测试,测试 GTK 2 和 GTK 3。

JavaFX 的子任务:

  • 创建一个 shim 动态加载 GTK 2。
  • 使动态 GTK shim 支持 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)的应用程序将出现运行时问题。