Lombok 的@ToString導致的Maven編譯錯誤

banq發表於2021-06-01

大多數後端元件共享一些作為 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搜尋父目錄以獲取進一步的配置。

 

相關文章