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
sjavac
在 JPRT 中的所有平台上修复 - JDK-8019239正确清理
sjavac
启发式方法
将要处理的其他问题包括:
- 重构协议,可能通过利用 RMI
- 使选项名称和语法与
javac
System.{out,err}
用更合适的东西替换日志记录javac
尽可能通过共享更多资源来提高并行性
未来需要解决的问题包括但不限于:
- 国际化
- 支持拼图
javac
需要进行某些调整。最值得注意的是,javac
必须进行重构,以允许多个并发编译共享通用数据结构,从而在多核计算机上实现更好的加速和更高的 CPU 利用率。
测试
除了通常的强制性单元测试之外,sjavac
还将在所有 平台上进行彻底测试,因为该工具的某些部分涉及特定于平台的方面,例如文件路径和后台进程的生成。
此外,sjavac
由于服务器-客户端架构本质上是并行的,因此将在考虑并发性的情况下进行压力测试。
依赖关系
该 JEP 提出的工作建立在JEP 139的结果之上:增强javac
以提高构建速度。