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

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

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

概述

在使用 Lombok 簡(jiǎn)化 Java 開(kāi)發(fā)時(shí),不少開(kāi)發(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ò)根源切入,拆解問(wèn)題本質(zhì),提供 4 套可落地的解決方案,并補(bǔ)充避坑要點(diǎn),幫助開(kāi)發(fā)者徹底解決該問(wèn)題。

一、報(bào)錯(cuò)根源:JDK 模塊化與 Lombok 的核心沖突

要解決報(bào)錯(cuò),需先理解兩個(gè)關(guān)鍵技術(shù)點(diǎn)的交互邏輯:

1. JDK 9 + 的模塊化機(jī)制:從 “開(kāi)放” 到 “隔離”

JDK 8 及之前版本,Java 類(lèi)加載采用 “全局可見(jiàn)” 模式,JDK 內(nèi)部類(lèi)(如com.sun.tools.javac相關(guān)類(lèi))可被外部代碼直接訪問(wèn)。但從 JDK 9 開(kāi)始,Java 引入模塊化系統(tǒng)(Module System),核心目標(biāo)是實(shí)現(xiàn) “代碼隔離”:

  • JDK 按功能拆分為多個(gè)獨(dú)立模塊(如負(fù)責(zé)編譯的jdk.compiler、負(fù)責(zé)基礎(chǔ)功能的jdk.base);
  • 每個(gè)模塊通過(guò)module-info.java明確聲明 “對(duì)外暴露的包” 和 “依賴(lài)的模塊”;
  • 未聲明 “導(dǎo)出” 的內(nèi)部包(如jdk.compiler下的com.sun.tools.javac.processing),默認(rèn)拒絕外部訪問(wèn)。

2. Lombok 的運(yùn)行原理:依賴(lài) JDK 內(nèi)部編譯類(lèi)

Lombok 并非普通 Java 庫(kù),其核心能力(如@Data自動(dòng)生成 getter/setter、@Slf4j創(chuàng)建日志對(duì)象)依賴(lài)Java 編譯時(shí)注解處理器(APT)

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

沖突點(diǎn):JDK 9 + 的jdk.compiler模塊未 “導(dǎo)出”com.sun.tools.javac.processing包,而 Lombok 默認(rèn)處于 “無(wú)名模塊(unnamed module)” 中,無(wú)法訪問(wèn)該內(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 模塊化問(wèn)題持續(xù)適配,從1.18.16版本開(kāi)始,通過(guò)優(yōu)化內(nèi)部邏輯減少對(duì) JDK 內(nèi)部類(lèi)的依賴(lài),或通過(guò)合規(guī)方式訪問(wèn),直接規(guī)避報(bào)錯(cuò)。這是最簡(jiǎn)單、最穩(wěn)定的解決方案。

操作步驟:

  • 查看當(dāng)前 Lombok 版本pom.xml(Maven)或build.gradle(Gradle)中找到 Lombok 依賴(lài),確認(rèn)當(dāng)前版本(如舊版本1.18.10需升級(jí))。
  • 替換為最新穩(wěn)定版本訪問(wèn)Lombok 官方 Maven 倉(cāng)庫(kù),獲取最新版本(截至 2024 年,最新穩(wěn)定版為1.18.30),替換依賴(lài)配置。

Maven 項(xiàng)目示例

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.30</version> <!-- 替換為最新版本 -->
    <scope>provided</scope> <!-- 編譯時(shí)依賴(lài),不打包到最終產(chǎn)物 -->
</dependency>

Gradle 項(xiàng)目示例

dependencies {
    provided 'org.projectlombok:lombok:1.18.30' // 編譯時(shí)依賴(lài)
    annotationProcessor 'org.projectlombok:lombok:1.18.30' // 必須配置注解處理器
}

驗(yàn)證效果Maven 執(zhí)行mvn clean compile,Gradle 執(zhí)行gradle clean build,若編譯通過(guò),報(bào)錯(cuò)已解決。

方案二:添加 JVM 編譯參數(shù),顯式 “導(dǎo)出” 內(nèi)部包

若因項(xiàng)目依賴(lài)限制(如必須使用舊版本 Lombok)無(wú)法升級(jí),可通過(guò)JVM 參數(shù)強(qiáng)制jdk.compiler導(dǎo)出內(nèi)部包,打破模塊化訪問(wèn)限制。

不同構(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)部類(lèi)報(bào)錯(cuò),可追加類(lèi)似參數(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)境問(wèn)題)

有時(shí)報(bào)錯(cuò)并非代碼 / 依賴(lài)問(wèn)題,而是 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 依賴(lài)注解處理器工作,若未啟用會(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ā)模塊化適配問(wèn)題:

  • 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包可直接訪問(wèn),不會(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ǔ)法、接口私有方法),避免新的兼容性問(wèn)題。

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

  1. 優(yōu)先升級(jí) Lombok,拒絕 “繞過(guò)” 機(jī)制添加--add-exports參數(shù)本質(zhì)是 “繞過(guò)” 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è)依賴(lài)間接引入不同版本 Lombok(如 A 依賴(lài)用 1.18.10,B 依賴(lài)用 1.18.30),會(huì)導(dǎo)致處理器加載異常。可通過(guò)以下命令查看依賴(lài)樹(shù),排除舊版本:

    • 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ú)法訪問(wèn) jdk.compiler 內(nèi)部類(lèi)” 的核心是JDK 9 + 模塊化與 Lombok 運(yùn)行依賴(lài)的沖突。解決問(wè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 版本同步,是避免此類(lèi)兼容性問(wèn)題的長(zhǎng)期策略。

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

相關(guān)文章

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

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

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

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

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

    解決IDEA2020.1版本不兼容Lombok的問(wèn)題

    這篇文章主要介紹了解決IDEA2020.1版本不兼容Lombok的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(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)行異常處理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Java方法及數(shù)組相關(guān)原理解析

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

    這篇文章主要介紹了Java方法及數(shù)組相關(guān)原理解析,文中通過(guò)示例代碼介紹的非常詳細(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),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • Java Http的基礎(chǔ)概念了解

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

    這篇文章主要介紹了Java Http的基礎(chǔ)概念,HTTP協(xié)議是建立在TCP協(xié)議之上的,這個(gè)程序是通過(guò)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ù)載過(guò)程

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

    這篇文章主要介紹了springboot IDEA啟動(dòng)兩個(gè)端口服務(wù)nginx負(fù)載過(guò)程,具有很好的參考價(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)論

凤庆县| 蒲江县| 五家渠市| 武强县| 长春市| 巴中市| 吉隆县| 乌拉特前旗| 墨竹工卡县| 留坝县| 高邮市| 龙口市| 吉安县| 育儿| 阿拉善右旗| 吴川市| 荔波县| 闵行区| 上杭县| 永定县| 固原市| 芒康县| 宜川县| 平湖市| 河西区| 班玛县| 绥阳县| 邵阳市| 长丰县| 香格里拉县| 佳木斯市| 宿迁市| 永兴县| 新邵县| 米林县| 黄骅市| 措美县| 玉龙| 聂荣县| 新疆| 汝城县|