JEP 199: Smart Java Compilation, Phase Two | 智能 Java 编译,第二阶段
摘要
改进 sjavac
工具,使其可以默认在 JDK 构建中使用,并通用化,以便用于除了 JDK 之外的大型项目的构建。
目标
由于与稳定性和可移植性相关的各种问题,sjavac
在 JDK 构建脚本中不被默认使用。该 JEP 的第一个目标是解决这些问题。这涉及确保该工具在所有软件/硬件配置下始终生成可靠的结果。
总体目标是提高 sjavac
的质量,使其能够作为通用的 javac
包装器,能够编译任意大型 Java 项目。
后续项目将探讨 sjavac
在 JDK 工具链中的展现方式,如果有的话;这可能是一个单独支持的独立工具,一个不受支持的独立工具,与 javac
的集成,或其他形式。
非目标
本 JEP 的目标不是引入新功能,这些功能今天并不存在,不是我们自己构建脚本所需的,也不对通用的 javac
包装器有贡献。意图不是重写包装器。已经良好运作的当前功能将保持原样。
如果需要将 sjavac
纳入产品中,将会有一个单独的 JEP 进行讨论。
动机
当前的实现已经证明是有用的,确实提高了构建速度并允许增量构建。然而,代码的质量和工具的稳定性还不令人满意,肯定还没有准备好发布给公众。
描述
这项工作是在之前交付的 JEP 139 中描述的实现基础上进行的。本 JEP 中描述的工作将通过逐步编写、测试和提交增量补丁来完成。
最初的工作集中在解决与构建 JDK 相关的问题上。这包括解决以下问题:
- JDK-8014510 Fix
sjavac
on all platforms in JPRT
JDK-8014510 修复在 JPRT 上的各个平台上的sjavac
问题 - JDK-8019239 Properly clean up
sjavac
heuristics
JDK-8019239 正确清理sjavac
的启发式算法
还将解决其他问题,包括:
- 重构协议,可能利用 RMI 技术
- 使选项名称和语法更符合
javac
的风格 - 用更合适的方式替换
System.{out,err}
日志记录 - 通过在可能的情况下在
javac
中共享更多资源来增加并行性
还将在之后解决的问题包括但不限于:
- 国际化
- 对 Jigsaw 的支持
需要进行某些 javac
的调整。特别是,javac
将需要重构,以允许多个并发编译共享通用数据结构,以实现更好的加速和更高的多核 CPU 利用率。
测试
除了通常的强制性单元测试外,sjavac
将在所有平台上进行全面测试,因为该工具的部分涉及特定于平台的因素,如文件路径和后台进程的生成。
此外,sjavac
将以并发测试为重点进行压力测试,因为服务器 - 客户端架构本质上是并行的。
依赖
本 JEP 所提出的工作建立在 JEP 139 的结果之上:增强 javac
以提高构建速度。