编译 Java 单元测试非常慢
Compiling Java unit tests very slow
我正在开发一个新的多模块 Maven 项目 (Java11+),因为我们向项目添加了越来越多的单元测试,我注意到编译我们的测试变得非常慢。所以我开始分析这个项目,这里是编译一个典型模块的结果:
- “测试编译”为 18 个文件花费了 109 秒
- “编译”(非测试 类)76 个文件用了 4 秒。
我的 Windows 笔记本上有 运行 这个 Java11 (OpenJDK) 但可以在 Java17 和 OracleJDK 以及 Linux 上复制它机器。我不知道是什么导致了这种巨大的差异(每个文件 0.05 秒对每个文件 6 秒)。我们主要使用 Spring-Boot,对于我们的测试,我们使用 Junit5 和 spring-boot-starter-test、Mockito 和 AssertJ。
这是一个使用我们的 maven 配置的最小复制器:
https://github.com/elbird/slow-test-compile
经过反复试验,我找到了罪魁祸首:lombok。
我无法解释为什么,但在我的复制器 https://github.com/elbird/slow-test-compile 中,我发现至少在版本 1.18.20(及更低版本)中的 lombok 在使用 Java11+ 编译时确实很慢。 (尤其是像 assertjs assertThat()
这样重载的方法)
幸运的是,在 lombok 1.18.22 中,这个问题似乎得到了解决。该修复似乎与此错误有关:https://github.com/projectlombok/lombok/issues/2652 已通过以下更改日志条目修复:
IMPROBABLE BREAKING CHANGE: If the underlying compiler and --release / --source option is 10 or higher, lombok's val is now replaced by final var.
https://projectlombok.org/changelog
TLDR:更新到 lombok 1.18.22 解决了这个问题。
我正在开发一个新的多模块 Maven 项目 (Java11+),因为我们向项目添加了越来越多的单元测试,我注意到编译我们的测试变得非常慢。所以我开始分析这个项目,这里是编译一个典型模块的结果:
- “测试编译”为 18 个文件花费了 109 秒
- “编译”(非测试 类)76 个文件用了 4 秒。
我的 Windows 笔记本上有 运行 这个 Java11 (OpenJDK) 但可以在 Java17 和 OracleJDK 以及 Linux 上复制它机器。我不知道是什么导致了这种巨大的差异(每个文件 0.05 秒对每个文件 6 秒)。我们主要使用 Spring-Boot,对于我们的测试,我们使用 Junit5 和 spring-boot-starter-test、Mockito 和 AssertJ。
这是一个使用我们的 maven 配置的最小复制器: https://github.com/elbird/slow-test-compile
经过反复试验,我找到了罪魁祸首:lombok。
我无法解释为什么,但在我的复制器 https://github.com/elbird/slow-test-compile 中,我发现至少在版本 1.18.20(及更低版本)中的 lombok 在使用 Java11+ 编译时确实很慢。 (尤其是像 assertjs assertThat()
这样重载的方法)
幸运的是,在 lombok 1.18.22 中,这个问题似乎得到了解决。该修复似乎与此错误有关:https://github.com/projectlombok/lombok/issues/2652 已通过以下更改日志条目修复:
IMPROBABLE BREAKING CHANGE: If the underlying compiler and --release / --source option is 10 or higher, lombok's val is now replaced by final var.
https://projectlombok.org/changelog
TLDR:更新到 lombok 1.18.22 解决了这个问题。