Lombok 的@ToString导致的Maven编译错误


大多数后端组件共享一些作为 maven 依赖项使用的公共代码。几天来,这个公共库的构建因编译错误而间歇性失败——这是您几乎从未见过的,因为编译(与测试相反)本质上是确定性的。
构建失败,出现以下 2 个错误:

17:42:56 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project distributed-lock-api: Compilation failure:
17:42:56 [ERROR] ~/jenkins/workspace/iplan-common-PL/distributed-lock-api/src/main/java/com/att/distributedlock/DistributedLockResponse.java:[10,1] package org.springframework.lang does not exist
17:42:56 [ERROR] ~/jenkins/workspace/iplan-common-PL/distributed-lock-api/src/main/java/com/att/distributedlock/DistributedLockStatusResponse.java:[12,1] package org.springframework.lang does not exist

使用:./mvnw clean compile -pl distributed-lock-api -am。如果你不熟悉 maven: 这个命令是仅在分布式锁 API模块(编译失败)及其依赖项上运行clean & compile。
这时编译器抱怨的缺失包 ( org.springframework.lang ) 不在源代码中,我怀疑Lombok
因为它的注释处理器在 java 编译器处理文件之前修改了源代码。我选择了 2 个有问题的文件之一并开始进行更改——首先我将 Lombok 的@ToString注释向下移动了几行,并看到报告的错误行相应地移动。然后我删除了@ToString注释,错误就消失了。
在这一点上,我不太明白为什么 Lombok 的@ToString会导致这个错误,但至少我有一个可行的解决方案 : 使用 IDE 生成 toString 方法并完成它。
 
这个问题仍然困扰着我,所以我深入研究了。我知道 Lombok 有一个配置系统,可以让您在源代码中添加诸如org.springframework.lang.NonNull等注释。事实上,我们在组的主要应用程序中使用了这种配置。它需要添加带有诸如lombok.addNullAnnotations = spring 之类的指令的lombok.config文件。但是我搜索了该文件(通常放置在项目根目录中),它不存在。但在使用Jenkins构建时lombok.config有可能在 Jenkins 工作区的父目录之一,这时因为lombok查看父目录以获取更多配置文件lombok.config。
完全解决办法是:在公共lib 根目录中放置了一个lombok.config文件,其中包含一个指令以停止lombok搜索父目录以获取进一步的配置。