Lombok 報(bào)錯(cuò):無法訪問 jdk.compiler 內(nèi)部類的解決方案
概述
在使用 Lombok 簡化 Java 開發(fā)時(shí),不少開發(fā)者在 JDK 9 及以上版本會(huì)遇到如下報(bào)錯(cuò):class
lombok.javac.apt.LombokProcessor (in unnamed module @0x6971c6b7) cannot access class com.sun.tools.javac.processing.JavacProcessingEnvironment (in module jdk.compiler) because module jdk.compiler does not export com.sun.tools.javac.processing to unnamed module @0x6971c6b7
本文將從報(bào)錯(cuò)根源切入,拆解問題本質(zhì),提供 4 套可落地的解決方案,并補(bǔ)充避坑要點(diǎn),幫助開發(fā)者徹底解決該問題。
一、報(bào)錯(cuò)根源:JDK 模塊化與 Lombok 的核心沖突
要解決報(bào)錯(cuò),需先理解兩個(gè)關(guān)鍵技術(shù)點(diǎn)的交互邏輯:
1. JDK 9 + 的模塊化機(jī)制:從 “開放” 到 “隔離”
JDK 8 及之前版本,Java 類加載采用 “全局可見” 模式,JDK 內(nèi)部類(如com.sun.tools.javac相關(guān)類)可被外部代碼直接訪問。但從 JDK 9 開始,Java 引入模塊化系統(tǒng)(Module System),核心目標(biāo)是實(shí)現(xiàn) “代碼隔離”:
- JDK 按功能拆分為多個(gè)獨(dú)立模塊(如負(fù)責(zé)編譯的
jdk.compiler、負(fù)責(zé)基礎(chǔ)功能的jdk.base); - 每個(gè)模塊通過
module-info.java明確聲明 “對(duì)外暴露的包” 和 “依賴的模塊”; - 未聲明 “導(dǎo)出” 的內(nèi)部包(如
jdk.compiler下的com.sun.tools.javac.processing),默認(rèn)拒絕外部訪問。
2. Lombok 的運(yùn)行原理:依賴 JDK 內(nèi)部編譯類
Lombok 并非普通 Java 庫,其核心能力(如@Data自動(dòng)生成 getter/setter、@Slf4j創(chuàng)建日志對(duì)象)依賴Java 編譯時(shí)注解處理器(APT):
- 編譯階段,Lombok 通過
lombok.javac.apt.LombokProcessor介入javac編譯器流程; - 需訪問
com.sun.tools.javac.processing.JavacProcessingEnvironment(javac內(nèi)部管理注解處理器的核心類),才能修改抽象語法樹(AST),實(shí)現(xiàn) “少寫代碼” 的效果。
沖突點(diǎn):JDK 9 + 的jdk.compiler模塊未 “導(dǎo)出”com.sun.tools.javac.processing包,而 Lombok 默認(rèn)處于 “無名模塊(unnamed module)” 中,無法訪問該內(nèi)部包,最終觸發(fā)權(quán)限報(bào)錯(cuò)。
二、4 套解決方案:從簡單到進(jìn)階(優(yōu)先級(jí)排序)
根據(jù)項(xiàng)目實(shí)際場景(Lombok 版本、JDK 版本、構(gòu)建工具),可選擇以下方案,推薦優(yōu)先嘗試前兩種。
方案一:升級(jí) Lombok 到最新版本(首選無侵入方案)
Lombok 團(tuán)隊(duì)已針對(duì) JDK 模塊化問題持續(xù)適配,從1.18.16版本開始,通過優(yōu)化內(nèi)部邏輯減少對(duì) JDK 內(nèi)部類的依賴,或通過合規(guī)方式訪問,直接規(guī)避報(bào)錯(cuò)。這是最簡單、最穩(wěn)定的解決方案。
操作步驟:
- 查看當(dāng)前 Lombok 版本在
pom.xml(Maven)或build.gradle(Gradle)中找到 Lombok 依賴,確認(rèn)當(dāng)前版本(如舊版本1.18.10需升級(jí))。 - 替換為最新穩(wěn)定版本訪問Lombok 官方 Maven 倉庫,獲取最新版本(截至 2024 年,最新穩(wěn)定版為
1.18.30),替換依賴配置。
Maven 項(xiàng)目示例:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.30</version> <!-- 替換為最新版本 -->
<scope>provided</scope> <!-- 編譯時(shí)依賴,不打包到最終產(chǎn)物 -->
</dependency>Gradle 項(xiàng)目示例:
dependencies {
provided 'org.projectlombok:lombok:1.18.30' // 編譯時(shí)依賴
annotationProcessor 'org.projectlombok:lombok:1.18.30' // 必須配置注解處理器
}驗(yàn)證效果Maven 執(zhí)行mvn clean compile,Gradle 執(zhí)行gradle clean build,若編譯通過,報(bào)錯(cuò)已解決。
方案二:添加 JVM 編譯參數(shù),顯式 “導(dǎo)出” 內(nèi)部包
若因項(xiàng)目依賴限制(如必須使用舊版本 Lombok)無法升級(jí),可通過JVM 參數(shù)強(qiáng)制jdk.compiler導(dǎo)出內(nèi)部包,打破模塊化訪問限制。
不同構(gòu)建工具的配置方式:
1. Maven 項(xiàng)目:配置maven-compiler-plugin
在pom.xml的build/plugins節(jié)點(diǎn)下添加插件,指定編譯參數(shù):
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 適配JDK 9+的最低版本 -->
<configuration>
<source>17</source> <!-- 與項(xiàng)目JDK版本一致(如JDK 17) -->
<target>17</target>
<encoding>UTF-8</encoding>
<compilerArgs>
<!-- 核心參數(shù):允許jdk.compiler導(dǎo)出內(nèi)部包給所有無名模塊 -->
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED</arg>
<!-- 若后續(xù)出現(xiàn)其他內(nèi)部類報(bào)錯(cuò),可追加類似參數(shù),例如:
<arg>--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED</arg>
-->
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>2. Gradle 項(xiàng)目:配置compileJava任務(wù)
在build.gradle中添加編譯參數(shù):
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
sourceCompatibility = JavaVersion.VERSION_17 // 與項(xiàng)目JDK一致
targetCompatibility = JavaVersion.VERSION_17
// 添加JVM參數(shù)
options.compilerArgs += [
'--add-exports=jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED'
]
}3. IDE 臨時(shí)配置(測試用)
若需在 IDE 中快速驗(yàn)證,可直接配置編譯參數(shù):
- IntelliJ IDEA:
File > Settings > Build > Compiler > Java Compiler,在 “Additional command line parameters” 中輸入上述參數(shù),重建項(xiàng)目。 - Eclipse:
Project > Properties > Java Compiler > Annotation Processing,勾選 “Enable annotation processing”,并在 “Factory Path” 添加 Lombok JAR 包,同時(shí)補(bǔ)充上述參數(shù)。
方案三:修復(fù) IDE 的 Lombok 配置(排除環(huán)境問題)
有時(shí)報(bào)錯(cuò)并非代碼 / 依賴問題,而是 IDE 的 Lombok 插件或注解處理功能未正確配置,導(dǎo)致處理器無法運(yùn)行。需從 3 點(diǎn)排查:
1. 確認(rèn) IDE 已安裝 Lombok 插件
- IntelliJ IDEA:
File > Settings > Plugins,搜索 “Lombok”,確認(rèn)已安裝并啟用(安裝后需重啟 IDE)。 - Eclipse:
Help > Eclipse Marketplace,搜索 “Lombok” 安裝,重啟后生效。
2. 啟用 “注解處理” 功能
Lombok 依賴注解處理器工作,若未啟用會(huì)導(dǎo)致處理器加載失?。?/p>
- IntelliJ IDEA:
File > Settings > Build > Annotation Processors,勾選 “Enable annotation processing”。 - Eclipse:
Project > Properties > Java Compiler > Annotation Processing,勾選 “Enable annotation processing”。
3. 統(tǒng)一 IDE 與項(xiàng)目的 JDK 版本
若 IDE 使用的 JDK 與項(xiàng)目配置不一致(如項(xiàng)目用 JDK 17,IDE 用 JDK 8),會(huì)觸發(fā)模塊化適配問題:
- IntelliJ IDEA:
File > Project Structure > Project,將 “Project SDK” 改為項(xiàng)目使用的 JDK 版本。
方案四:降級(jí) JDK 到 8 版本(應(yīng)急方案,不推薦)
若上述方案均無法實(shí)施,可臨時(shí)將 JDK 降級(jí)到 JDK 8——JDK 8 無模塊化機(jī)制,com.sun.tools.javac.processing包可直接訪問,不會(huì)報(bào)錯(cuò)。
注意事項(xiàng):
- JDK 8 已于 2026 年停止 Oracle 官方支持,長期使用存在安全風(fēng)險(xiǎn);
- 降級(jí)前需確認(rèn)項(xiàng)目無 JDK 9 + 特性(如模塊化語法、接口私有方法),避免新的兼容性問題。
三、避坑指南:解決后的關(guān)鍵注意事項(xiàng)
優(yōu)先升級(jí) Lombok,拒絕 “繞過” 機(jī)制添加
--add-exports參數(shù)本質(zhì)是 “繞過” JDK 模塊化規(guī)則,若未來 JDK 調(diào)整內(nèi)部包結(jié)構(gòu)(如移除com.sun.tools.javac.processing),該參數(shù)會(huì)失效;而升級(jí) Lombok 是官方適配方案,兼容性更強(qiáng)。避免 Lombok 版本沖突若項(xiàng)目中多個(gè)依賴間接引入不同版本 Lombok(如 A 依賴用 1.18.10,B 依賴用 1.18.30),會(huì)導(dǎo)致處理器加載異常??赏ㄟ^以下命令查看依賴樹,排除舊版本:
- Maven:
mvn dependency:tree | grep lombok - Gradle:
gradle dependencies | grep lombok
- Maven:
JDK 17 + 的額外適配JDK 17 對(duì)內(nèi)部 API 限制更嚴(yán)格,舊版本 Lombok(如 1.18.22 以下)即使添加
--add-exports也可能報(bào)錯(cuò),需確保 Lombok 版本≥1.18.22。
四、總結(jié)
Lombok 報(bào)錯(cuò) “無法訪問 jdk.compiler 內(nèi)部類” 的核心是JDK 9 + 模塊化與 Lombok 運(yùn)行依賴的沖突。解決問題的最優(yōu)路徑是:
- 優(yōu)先升級(jí) Lombok 到最新版本;
- 若無法升級(jí),添加 JVM 編譯參數(shù)導(dǎo)出內(nèi)部包;
- 最后排查 IDE 配置,確保插件與注解處理功能正常。
在 Java 生態(tài)升級(jí)的背景下,保持 Lombok 與 JDK 版本同步,是避免此類兼容性問題的長期策略。
到此這篇關(guān)于Lombok 報(bào)錯(cuò):無法訪問 jdk.compiler 內(nèi)部類的解決方案的文章就介紹到這了,更多相關(guān)Lombok無法訪問 jdk.compiler 內(nèi)部內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java如何向主函數(shù)main中傳入?yún)?shù)
這篇文章主要介紹了Java如何向主函數(shù)main中傳入?yún)?shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02
詳解SpringBoot集成Redis來實(shí)現(xiàn)緩存技術(shù)方案
本篇文章主要介紹了詳解SpringBoot集成Redis來實(shí)現(xiàn)緩存技術(shù)方案,具有一定的參考價(jià)值,有興趣的可以了解一下2017-06-06
新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目(圖文教程)
這篇文章主要介紹了新版本IntelliJ IDEA 構(gòu)建maven,并用Maven創(chuàng)建一個(gè)web項(xiàng)目的圖文教程,需要的朋友可以參考下2018-01-01
Java中使用File類創(chuàng)建文件方法總結(jié)
Java File類是I/O操作基礎(chǔ),用于表示文件路徑,提供構(gòu)造方法、文件創(chuàng)建、信息獲?。ㄈ缑Q、路徑、大小)及目錄操作,這篇文章主要介紹了Java中使用File類創(chuàng)建文件方法的相關(guān)資料,需要的朋友可以參考下2025-05-05
Java?18?新特性之Web服務(wù)器?jwebserver功能
JEP?408:?Simple?Web?Server,是這次Java?18推出的一個(gè)比較獨(dú)立的全新功能點(diǎn)。我們可以通過命令行工具來啟動(dòng)一個(gè)提供靜態(tài)資源訪問的迷你Web服務(wù)器,本文通過一個(gè)構(gòu)建HTML頁面的例子,來嘗試一下jwebserver的功能2022-04-04
mybaties?plus?selectMaps和selectList的區(qū)別說明
這篇文章主要介紹了mybaties?plus?selectMaps和selectList的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
java實(shí)現(xiàn)簡單圖書管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)簡單圖書管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法
本文主要介紹了java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03

