JEP 199:智能 Java 编译,第二阶段
概述
改进 sjavac
工具,使其能够默认在 JDK 构建中使用,并将其通用化,以便可以用于构建除 JDK 以外的大型项目。
目标
由于存在各种与稳定性及可移植性相关的问题,sjavac
并未在 JDK 构建脚本中默认使用。本 JEP 的首要目标是解决这些问题。这涉及到确保该工具在所有软件/硬件配置上始终产生可靠的结果。
总体目标是提高 sjavac
的质量,使其能够作为一个通用的 javac
包装器,能够编译大型任意 Java 项目。
后续项目将探讨 sjavac
应该如何在 JDK 工具链中被引入(如果有的话);这可能是一个单独支持的独立工具、不受支持的独立工具、与 javac
的集成,或者其他形式。
非目标
此 JEP 的目标并不是引入如今不存在、我们的构建脚本不需要、且无助于通用 javac
包装器的新功能。其意图并非重写该包装器。当前运行良好的功能将保持不变。
如果需要将 sjavac
纳入产品中,这将是另一份 JEP 的主题。
动机
当前的实现已经被证明是有用的,并且确实提高了构建速度,允许增量构建。然而,代码的质量和工具整体的稳定性并不令人满意,并且肯定还没有准备好公开发布。
描述
这项工作建立在之前提交的 JEP 139 中描述的实现之上。本 JEP 中描述的工作将通过编写、测试和提交增量补丁到现有实现来逐步完成。
最初的工作重点是解决与构建 JDK 相关的问题。这包括解决:
- JDK-8014510 在 JPRT 中修复所有平台上的
sjavac
- JDK-8019239 正确清理
sjavac
启发式规则
其他将要处理的问题包括:
- 重构协议,可能通过利用 RMI 实现
- 使选项名称和语法与
javac
的更加一致 - 用更合适的内容替换
System.{out,err}
日志记录 - 在可能的情况下,通过在
javac
中共享更多资源来提高并行性
日后需要进一步解决的问题包括但不限于:
- 国际化
- 对 Jigsaw 的支持
javac
需要进行一些调整。最值得注意的是,必须对 javac
进行重构,以允许多个并发编译共享通用数据结构,从而在多核机器上实现更好的加速效果和更高的 CPU 利用率。
测试
除了常规的强制单元测试之外,sjavac
将在所有平台上进行彻底测试,因为该工具的部分功能涉及特定于平台的方面,例如文件路径和后台进程的生成。
此外,由于服务器-客户端架构本质上是并行的,sjavac
将在考虑并发的情况下进行压力测试。
依赖
这项 JEP 提出的工作建立在 JEP 139 的结果之上:增强 javac
以提高构建速度。