最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Lombok 報(bào)錯(cuò):無(wú)法訪問 jdk.compiler 內(nèi)部類的解決方案

 更新時(shí)間:2025年10月22日 15:38:08   作者:小猿、  
本文分析了JDK9及以上版本中Lombok報(bào)錯(cuò)"無(wú)法訪問jdk.compiler內(nèi)部類"的問題根源,并提供了4中解決方案,具有一定的參考價(jià)值,感興趣的可以了解一下

概述

在使用 Lombok 簡(jiǎn)化 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 庫(kù),其核心能力(如@Data自動(dòng)生成 getter/setter、@Slf4j創(chuàng)建日志對(duì)象)依賴Java 編譯時(shí)注解處理器(APT)

  • 編譯階段,Lombok 通過lombok.javac.apt.LombokProcessor介入javac編譯器流程;
  • 需訪問com.sun.tools.javac.processing.JavacProcessingEnvironmentjavac內(nèi)部管理注解處理器的核心類),才能修改抽象語(yǔ)法樹(AST),實(shí)現(xiàn) “少寫代碼” 的效果。

沖突點(diǎn):JDK 9 + 的jdk.compiler模塊未 “導(dǎo)出”com.sun.tools.javac.processing包,而 Lombok 默認(rèn)處于 “無(wú)名模塊(unnamed module)” 中,無(wú)法訪問該內(nèi)部包,最終觸發(fā)權(quán)限報(bào)錯(cuò)。

二、4 套解決方案:從簡(jiǎn)單到進(jìn)階(優(yōu)先級(jí)排序)

根據(jù)項(xiàng)目實(shí)際場(chǎng)景(Lombok 版本、JDK 版本、構(gòu)建工具),可選擇以下方案,推薦優(yōu)先嘗試前兩種。

方案一:升級(jí) Lombok 到最新版本(首選無(wú)侵入方案)

Lombok 團(tuán)隊(duì)已針對(duì) JDK 模塊化問題持續(xù)適配,從1.18.16版本開始,通過優(yōu)化內(nèi)部邏輯減少對(duì) JDK 內(nèi)部類的依賴,或通過合規(guī)方式訪問,直接規(guī)避報(bào)錯(cuò)。這是最簡(jiǎn)單、最穩(wěn)定的解決方案。

操作步驟:

  • 查看當(dāng)前 Lombok 版本pom.xml(Maven)或build.gradle(Gradle)中找到 Lombok 依賴,確認(rèn)當(dāng)前版本(如舊版本1.18.10需升級(jí))。
  • 替換為最新穩(wěn)定版本訪問Lombok 官方 Maven 倉(cāng)庫(kù),獲取最新版本(截至 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)無(wú)法升級(jí),可通過JVM 參數(shù)強(qiáng)制jdk.compiler導(dǎo)出內(nèi)部包,打破模塊化訪問限制。

不同構(gòu)建工具的配置方式:

1. Maven 項(xiàng)目:配置maven-compiler-plugin

pom.xmlbuild/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)部包給所有無(wú)名模塊 -->
                    <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í)配置(測(cè)試用)

若需在 IDE 中快速驗(yàn)證,可直接配置編譯參數(shù):

  • IntelliJ IDEAFile > Settings > Build > Compiler > Java Compiler,在 “Additional command line parameters” 中輸入上述參數(shù),重建項(xiàng)目。
  • EclipseProject > 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)致處理器無(wú)法運(yùn)行。需從 3 點(diǎn)排查:

1. 確認(rèn) IDE 已安裝 Lombok 插件

  • IntelliJ IDEAFile > Settings > Plugins,搜索 “Lombok”,確認(rèn)已安裝并啟用(安裝后需重啟 IDE)。
  • EclipseHelp > Eclipse Marketplace,搜索 “Lombok” 安裝,重啟后生效。

2. 啟用 “注解處理” 功能

Lombok 依賴注解處理器工作,若未啟用會(huì)導(dǎo)致處理器加載失?。?/p>

  • IntelliJ IDEAFile > Settings > Build > Annotation Processors,勾選 “Enable annotation processing”。
  • EclipseProject > 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 IDEAFile > Project Structure > Project,將 “Project SDK” 改為項(xiàng)目使用的 JDK 版本。

方案四:降級(jí) JDK 到 8 版本(應(yīng)急方案,不推薦)

若上述方案均無(wú)法實(shí)施,可臨時(shí)將 JDK 降級(jí)到 JDK 8——JDK 8 無(wú)模塊化機(jī)制,com.sun.tools.javac.processing包可直接訪問,不會(huì)報(bào)錯(cuò)。

注意事項(xiàng):

  • JDK 8 已于 2026 年停止 Oracle 官方支持,長(zhǎng)期使用存在安全風(fēng)險(xiǎn);
  • 降級(jí)前需確認(rèn)項(xiàng)目無(wú) JDK 9 + 特性(如模塊化語(yǔ)法、接口私有方法),避免新的兼容性問題。

三、避坑指南:解決后的關(guān)鍵注意事項(xiàng)

  1. 優(yōu)先升級(jí) Lombok,拒絕 “繞過” 機(jī)制添加--add-exports參數(shù)本質(zhì)是 “繞過” JDK 模塊化規(guī)則,若未來(lái) JDK 調(diào)整內(nèi)部包結(jié)構(gòu)(如移除com.sun.tools.javac.processing),該參數(shù)會(huì)失效;而升級(jí) Lombok 是官方適配方案,兼容性更強(qiáng)。

  2. 避免 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
  3. 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ò) “無(wú)法訪問 jdk.compiler 內(nèi)部類” 的核心是JDK 9 + 模塊化與 Lombok 運(yùn)行依賴的沖突。解決問題的最優(yōu)路徑是:

  1. 優(yōu)先升級(jí) Lombok 到最新版本;
  2. 若無(wú)法升級(jí),添加 JVM 編譯參數(shù)導(dǎo)出內(nèi)部包;
  3. 最后排查 IDE 配置,確保插件與注解處理功能正常。

在 Java 生態(tài)升級(jí)的背景下,保持 Lombok 與 JDK 版本同步,是避免此類兼容性問題的長(zhǎng)期策略。

到此這篇關(guān)于Lombok 報(bào)錯(cuò):無(wú)法訪問 jdk.compiler 內(nèi)部類的解決方案的文章就介紹到這了,更多相關(guān)Lombok無(wú)法訪問 jdk.compiler 內(nèi)部?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java基于final修飾數(shù)據(jù)過程解析

    Java基于final修飾數(shù)據(jù)過程解析

    這篇文章主要介紹了Java基于final修飾數(shù)據(jù)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • SpringBoot Actuator未授權(quán)訪問漏洞的排查和解決方法

    SpringBoot Actuator未授權(quán)訪問漏洞的排查和解決方法

    Spring Boot Actuator 是開發(fā)和管理生產(chǎn)級(jí) Spring Boot 應(yīng)用程序的重要工具,它可以幫助你確保應(yīng)用程序的穩(wěn)定性和性能,本文給大家介紹了SpringBoot Actuator未授權(quán)訪問漏洞的排查和解決方法,需要的朋友可以參考下
    2024-05-05
  • 解決IDEA2020.1版本不兼容Lombok的問題

    解決IDEA2020.1版本不兼容Lombok的問題

    這篇文章主要介紹了解決IDEA2020.1版本不兼容Lombok的問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • springmvc如何進(jìn)行異常處理

    springmvc如何進(jìn)行異常處理

    這篇文章主要介紹了springmvc如何進(jìn)行異常處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java方法及數(shù)組相關(guān)原理解析

    Java方法及數(shù)組相關(guān)原理解析

    這篇文章主要介紹了Java方法及數(shù)組相關(guān)原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java8需要知道的4個(gè)函數(shù)式接口簡(jiǎn)單教程

    Java8需要知道的4個(gè)函數(shù)式接口簡(jiǎn)單教程

    這篇文章主要介紹了Java?8中引入的函數(shù)式接口,包括Consumer、Supplier、Predicate和Function,以及它們的用法和特點(diǎn),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java Http的基礎(chǔ)概念了解

    Java Http的基礎(chǔ)概念了解

    這篇文章主要介紹了Java Http的基礎(chǔ)概念,HTTP協(xié)議是建立在TCP協(xié)議之上的,這個(gè)程序是通過TCP編程來(lái)構(gòu)建一個(gè)簡(jiǎn)單的Http服務(wù)器,需要的朋友可以參考下
    2023-04-04
  • SpringBoot全局異常處理之解決404/500錯(cuò)誤

    SpringBoot全局異常處理之解決404/500錯(cuò)誤

    在搭建項(xiàng)目框架的時(shí)候用的是springboot,想統(tǒng)一處理異常,但是發(fā)現(xiàn)404的錯(cuò)誤總是捕捉不到,總是返回的是springBoot自帶的錯(cuò)誤結(jié)果信息,這篇文章主要給大家介紹了關(guān)于SpringBoot全局異常處理之解決404/500錯(cuò)誤的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • springboot IDEA啟動(dòng)兩個(gè)端口服務(wù)nginx負(fù)載過程

    springboot IDEA啟動(dòng)兩個(gè)端口服務(wù)nginx負(fù)載過程

    這篇文章主要介紹了springboot IDEA啟動(dòng)兩個(gè)端口服務(wù)nginx負(fù)載過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-03-03
  • BeanPostProcessor在顯示調(diào)用初始化方法前修改bean詳解

    BeanPostProcessor在顯示調(diào)用初始化方法前修改bean詳解

    這篇文章主要介紹了BeanPostProcessor在顯示調(diào)用初始化方法前修改bean詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12

最新評(píng)論

嘉义县| 平定县| 鄱阳县| 获嘉县| 平凉市| 加查县| 平舆县| 苍溪县| 翼城县| 凉山| 宜兰县| 图片| 五家渠市| 桐城市| 崇明县| 石城县| 呼伦贝尔市| 湛江市| 阿尔山市| 安图县| 敦煌市| 遵义市| 肇东市| 正宁县| 临邑县| 香港 | 乐山市| 兴山县| 嘉祥县| 长汀县| 财经| 临洮县| 新巴尔虎右旗| 闸北区| 涟源市| 吕梁市| 青浦区| 海伦市| 南陵县| 依兰县| 西峡县|