什么是sjavac,是谁的,我如何使用它?

在OpenJDK邮件列表上有一个名为sjavac的工具。 此外,还有两个相关的JEP : JEP 139:增强javac以提高构build速度和JEP 199:智能Java编译,第二阶段 。

我的问题是:

  • 什么是sjavac工具?
  • 这是为谁准备的?
  • 我如何使用它?

免责声明:自我回答问题。 只是想把这个工具的知识带到StackOverflow社区,并创build对未来sjavac FAQ的参考。

什么是sjavac工具?

sjavac工具是一个围绕javac的(据称是聪明的 )包装器,在Oracle开发,旨在提供以下function:

  • 增量编译 – 只重新编译必要的内容
  • 并行编译 – 在编译过程中使用多个核心
  • 保持编译器在一个热门的虚拟机 – 重复使用JIT的javac实例连续调用

在重新编译一组源文件时,javac会查看.java和.class文件的时间戳,以确定要保留的内容以及要重新编译的内容。 这是非常粗糙的,对于大型代码库可能是毁灭性的。 除了时间戳sjavac检查依赖的公共API来判断哪些文件需要重新编译。

Sjavac也试图将编译分割成多个javac调用。 换句话说,它为构build过程带来了高水平的并行性。

最后,sjavac工具被分割成一个客户端部分和一个服务器部分,它允许你离开sjavac在后台运行,被JIT控制并准备在连续调用中使用。

这是为谁准备的?

鼓励开发大型项目并在开发过程中经常重新编译代码的人尝试使用sjavac 。 (但请注意,该工具目前正在开发中,仍然存在未解决的问题。)

我如何使用它?

该工具尚未与OpenJDK一起提供,因此您必须从OpenJDK jdk9 / dev存储库中获取该工具。 另外,还没有启动器,所以你用java com.sun.tools.sjavac.Main调用它。

你可以在这里试试sjavac的jdk8 backport: http ://sjavac.s3-website-eu-west-1.amazonaws.com/