JEP 283:在 Linux 上启用 GTK 3
概述
启用基于 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
)的应用程序来说,将会出现运行时问题。