IntelliJ?IDEA?無(wú)法識(shí)別?Maven?SNAPSHOT?依賴(lài)但?Maven?編譯正常的根本原因
問(wèn)題現(xiàn)象
項(xiàng)目中引入了一個(gè) SNAPSHOT 版本的 Maven 依賴(lài)(如 com.example:my-service-client:1.0.0-SNAPSHOT),在 IntelliJ IDEA 中出現(xiàn)以下情況:
- 使用
mvn compile或mvn package編譯完全正常 - IDEA 中對(duì)應(yīng)的類(lèi)無(wú)法識(shí)別,顯示紅色報(bào)錯(cuò)
- 打開(kāi) IDEA 的 Project Structure > Libraries,可以看到該依賴(lài)的路徑指向一個(gè)不存在的 JAR 文件
例如,IDEA 中顯示的路徑為:
~/.m2/repository/com/example/my-service-client/1.0.0-SNAPSHOT/
my-service-client-1.0.0-20240101.100000-1.jar ← 文件不存在,顯示紅色而本地 Maven 倉(cāng)庫(kù)中實(shí)際存在的文件是:
~/.m2/repository/com/example/my-service-client/1.0.0-SNAPSHOT/
my-service-client-1.0.0-20240201.120000-2.jar ← 實(shí)際文件嘗試過(guò) Invalidate Caches / Restart,問(wèn)題依然存在。
根本原因
IDEA 的 Maven 緩存分兩層
| 緩存層 | 路徑 | 清除方式 |
|---|---|---|
| 索引緩存(文件搜索、符號(hào)索引) | ~/Library/Caches/JetBrains/<版本>/index/ | Invalidate Caches |
| 項(xiàng)目模型緩存(Maven 依賴(lài)解析結(jié)果) | ~/Library/Caches/JetBrains/<版本>/projects/<項(xiàng)目>.*/external_build_system/ | 僅 Maven Reload 時(shí)重建 |
Invalidate Caches 清除的是索引緩存,不會(huì)觸碰 external_build_system 目錄。
為什么 Maven Reload 沒(méi)有修復(fù)它
SNAPSHOT 依賴(lài)每次構(gòu)建可能產(chǎn)生新的時(shí)間戳版本(如從 -1 升級(jí)到 -2)。當(dāng)遠(yuǎn)程倉(cāng)庫(kù)推送了新版本、本地 Maven 也完成了更新后,舊的帶時(shí)間戳 JAR 文件(-1.jar)已被替換。
此時(shí)若觸發(fā) IDEA 的 Maven Reload:
- IDEA 嘗試讀取舊路徑的 JAR 文件 → 文件不存在,Reload 出錯(cuò)
external_build_system/project/libraries.xml沒(méi)有被正確寫(xiě)入新值- 緩存停留在舊的時(shí)間戳版本,循環(huán)報(bào)錯(cuò)
解決方案
方法一:直接修改項(xiàng)目模型緩存文件(推薦)
第一步:確認(rèn)本地倉(cāng)庫(kù)中實(shí)際存在的 JAR 文件名:
ls ~/.m2/repository/com/<groupId>/<artifactId>/<version>/
記錄實(shí)際存在的時(shí)間戳版本號(hào),例如 1.0.0-20240201.120000-2。
第二步:找到 IDEA 對(duì)應(yīng)項(xiàng)目的緩存目錄:
~/Library/Caches/JetBrains/<IDEA版本>/projects/
在該目錄下找到對(duì)應(yīng)的項(xiàng)目目錄(格式為 <項(xiàng)目名>.<hash>),進(jìn)入:
<項(xiàng)目名>.<hash>/external_build_system/project/libraries.xml
第三步:用文本編輯器打開(kāi) libraries.xml,搜索包名,將舊時(shí)間戳版本號(hào)全部替換為新版本號(hào):
<!-- 修改前 --> <properties version="1.0.0-20240101.100000-1" ... /> <root url="jar://.../my-service-client-1.0.0-20240101.100000-1.jar!/" /> <!-- 修改后 --> <properties version="1.0.0-20240201.120000-2" ... /> <root url="jar://.../my-service-client-1.0.0-20240201.120000-2.jar!/" />
第四步:重新打開(kāi) IDEA,問(wèn)題解決。無(wú)需關(guān)閉 IDEA 也可直接修改,修改后執(zhí)行一次 Maven > Reload All Maven Projects 即可生效。
方法二:命令行一鍵替換(macOS/Linux)
確認(rèn)新舊時(shí)間戳版本號(hào)后,直接用 sed 替換:
# 找到項(xiàng)目緩存目錄(替換 <IDEA版本> 和 <項(xiàng)目名.hash>) LIBS=~/Library/Caches/JetBrains/<IDEA版本>/projects/<項(xiàng)目名.hash>/external_build_system/project/libraries.xml # 替換舊時(shí)間戳為新時(shí)間戳 sed -i '' 's/1\.0\.0-20240101\.100000-1/1.0.0-20240201.120000-2/g' "$LIBS"
BASH 復(fù)制 全屏
為什么其他依賴(lài)沒(méi)有這個(gè)問(wèn)題
- Release 版本:文件名固定,不存在時(shí)間戳變化,緩存永久有效
- 其他 SNAPSHOT 依賴(lài):如果在上次成功的 Maven Reload 之后沒(méi)有發(fā)生版本更新,緩存中的路徑就是有效的,不會(huì)觸發(fā)此問(wèn)題
該問(wèn)題的觸發(fā)條件比較特殊:SNAPSHOT 依賴(lài)在本地已更新到新時(shí)間戳版本,但 IDEA 尚未完成一次成功的 Maven Reload,導(dǎo)致緩存停留在舊狀態(tài)且無(wú)法自愈。
總結(jié)
| Maven CLI | IntelliJ IDEA | |
|---|---|---|
| 解析 SNAPSHOT 依賴(lài) | 每次讀取 maven-metadata-local.xml,始終準(zhǔn)確 | 使用 external_build_system 緩存,僅 Reload 時(shí)更新 |
Invalidate Caches 能否修復(fù) | — | 不能,該目錄不在清除范圍內(nèi) |
| 修復(fù)方式 | 無(wú)需修復(fù) | 手動(dòng)修改 libraries.xml 或觸發(fā)成功的 Maven Reload |
到此這篇關(guān)于IntelliJ IDEA 無(wú)法識(shí)別 Maven SNAPSHOT 依賴(lài),但 Maven 編譯正常的文章就介紹到這了,更多相關(guān)IntelliJ IDEA 無(wú)法識(shí)別 Maven SNAPSHOT 依賴(lài),但 Maven 編譯正常內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- IDEA解析Maven依賴(lài)過(guò)慢的問(wèn)題
- IDEA查看Maven依賴(lài)樹(shù)與解決Jar包沖突的方法
- IDEA maven加載依賴(lài)失敗不展示Dependencies項(xiàng)的解決方案
- IDEA Maven提示:未解析的依賴(lài)項(xiàng)的問(wèn)題及解決
- idea項(xiàng)目報(bào)錯(cuò)缺失maven依賴(lài)問(wèn)題及解決
- IDEA創(chuàng)建的maven項(xiàng)目中pom.xml增加新依賴(lài)無(wú)效問(wèn)題及解決
- IDEA中Maven依賴(lài)包無(wú)法下載或?qū)氲慕鉀Q方案(系統(tǒng)缺失文件導(dǎo)致)
- IDEA搭建多模塊的Maven項(xiàng)目方式(相互依賴(lài))
- IDEA打包maven多模塊相互依賴(lài)項(xiàng)目全過(guò)程
相關(guān)文章
MyBatis實(shí)現(xiàn)動(dòng)態(tài)SQL更新的代碼示例
本文博小編將帶領(lǐng)大家學(xué)習(xí)如何利用 MyBatis 攔截器機(jī)制來(lái)優(yōu)雅的實(shí)現(xiàn)這個(gè)需求,文中通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-07-07
Java實(shí)現(xiàn)銳化圖片并保存功能(附源碼)
在圖像處理領(lǐng)域,銳化(Sharpening)?是一種常見(jiàn)的操作,用于增強(qiáng)圖像中邊緣和細(xì)節(jié),使圖像看起來(lái)更清晰,下面小編就來(lái)介紹一下如何使用Java?SE?原生?API實(shí)現(xiàn)對(duì)圖像的銳化處理并保存為常見(jiàn)格式文件吧2025-05-05
springboot讀取nacos配置文件的實(shí)現(xiàn)
SpringBoot注冊(cè)服務(wù)到Nacos上,由Nacos來(lái)做服務(wù)的管理,本文主要介紹了springboot讀取nacos配置文件的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
idea運(yùn)行main方法或Test避免編譯整個(gè)應(yīng)用的實(shí)現(xiàn)方法
這篇文章主要介紹了idea運(yùn)行main方法或Test避免編譯整個(gè)應(yīng)用的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
Mybatis-Plus自動(dòng)填充的實(shí)現(xiàn)示例
這篇文章主要介紹了Mybatis-Plus自動(dòng)填充的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
基于resty?security的Api權(quán)限控制與事務(wù)支持
這篇文章主要為大家介紹了基于resty?security的Api權(quán)限控制與事務(wù)支持讓數(shù)據(jù)操作處于事務(wù)控制下,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03
詳解使用Java代碼讀取并比較本地兩個(gè)txt文件區(qū)別
這篇文章主要為大家介紹了使用Java代碼讀取并比較本地兩個(gè)txt文件區(qū)別詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
.NET Core使用SignalR實(shí)現(xiàn)實(shí)時(shí)通訊的示例代碼
SignalR是一個(gè)ASP.NETCore庫(kù),用于在客戶(hù)端和服務(wù)器之間實(shí)現(xiàn)實(shí)時(shí)通訊,本文主要介紹了.NETCore中使用SignalR實(shí)現(xiàn)實(shí)時(shí)通訊,感興趣的可以了解一下2024-11-11
Spring Security中用JWT退出登錄時(shí)遇到的坑
使用了JWT后,每次請(qǐng)求都要攜帶 Bearer Token 并且被專(zhuān)門(mén)的過(guò)濾器攔截解析之后才能將用戶(hù)認(rèn)證信息保存到 SecurityContext 中去,接下來(lái)通過(guò)本文給大家介紹Spring Security中用JWT退出登錄時(shí)遇到的坑,感興趣的朋友一起看看吧2021-10-10

