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
)的应用程序将出现运行时问题。