
1. 先搞清楚Maven到底是個(gè)什么東西看到“Maven 3.8.8 安裝”這個(gè)標(biāo)題如果你還只是停留在“下載一個(gè)壓縮包、解壓、配個(gè)環(huán)境變量”這一步那我建議你先別急著動(dòng)手。Maven絕不是一個(gè)“只能幫你下載Jar包的工具”它是整個(gè)Java后端工程化體系的基石之一。我見過太多人把Maven當(dāng)成“網(wǎng)盤”用——項(xiàng)目缺什么包就搜什么坐標(biāo)根本不去理解它是怎么把你的源碼變成可運(yùn)行產(chǎn)物的結(jié)果換一個(gè)環(huán)境、換一個(gè)IDE項(xiàng)目就原地爆炸。Maven的核心價(jià)值可以用三句話概括第一它通過pom.xml文件對(duì)項(xiàng)目進(jìn)行“中央集權(quán)”式的管理所有依賴、插件、構(gòu)建配置全部集中在這一個(gè)文件里第二它定義了一套標(biāo)準(zhǔn)的生命周期validate、compile、test、package、install、deploy你只需要執(zhí)行mvn clean install它就會(huì)按部就班地幫你完成編譯、測(cè)試、打包、安裝第三它依賴本地倉庫和遠(yuǎn)程倉庫的機(jī)制做依賴管理說白了就是“自動(dòng)下載自動(dòng)引用”你不需要再手動(dòng)把一堆Jar包拷進(jìn)lib目錄。那為什么現(xiàn)在很多人專門搜“Maven 3.8.8”這個(gè)版本因?yàn)?.8.8是一個(gè)非常有代表性的穩(wěn)定版本。它處于3.8.x系列后期修復(fù)了不少HTTP嚴(yán)格安全問題同時(shí)默認(rèn)配置對(duì)JDK 8到JDK 17的兼容性都做得不錯(cuò)。你在搜索引擎里看到的熱詞“maven與jdk版本對(duì)應(yīng)關(guān)系”也側(cè)面說明了一個(gè)現(xiàn)實(shí)Maven版本和JDK版本不匹配是新手最容易踩的坑。這篇內(nèi)容不是讓你看完就只會(huì)“裝個(gè)Maven”而是希望你把“安裝、配置、排錯(cuò)”這一整套動(dòng)作背后的邏輯搞清楚。不管你是剛接觸Java的在校生還是從Eclipse轉(zhuǎn)IDEA的老開發(fā)甚至是要在Mac上從頭搭建構(gòu)建環(huán)境的運(yùn)維這篇內(nèi)容都能直接拿來用。我把Windows和Mac兩條線都講透再從本地倉庫講到阿里云鏡像最后聊一聊IDEA集成時(shí)那些“默認(rèn)配置偷走你時(shí)間”的坑。2. 安裝前的版本取舍與風(fēng)險(xiǎn)認(rèn)知2.1 為什么是3.8.8而不是3.9.x或者4.x先說結(jié)論如果你不是非要吃螃蟹建議就以3.8.8為基準(zhǔn)。很多人看到Apache官網(wǎng)最新版已經(jīng)到3.9.x甚至更高就會(huì)下意識(shí)想“是不是越新越好”。實(shí)際上Maven是一個(gè)極其成熟、幾乎處于“敵對(duì)狀態(tài)”的構(gòu)建工具——它的核心功能幾十年來沒有大的變化新版本更多是在修補(bǔ)邊緣問題而不是引入革命性體驗(yàn)。3.8.8這個(gè)版本的定位很有意思。它在3.8.x系列中處于“收尾穩(wěn)定期”相比3.8.1、3.8.3多了很多針對(duì)HTTP倉庫訪問的安全策略調(diào)整還修復(fù)了Windows環(huán)境下路徑解析的若干問題。而且它和IDEA內(nèi)置Maven的版本可以無縫銜接你在IDEA里直接使用自己安裝的3.8.8不會(huì)出現(xiàn)“內(nèi)置版本和外部版本切換后依賴結(jié)構(gòu)失效”的尷尬情況。還有一個(gè)現(xiàn)實(shí)因素很多企業(yè)級(jí)項(xiàng)目、老項(xiàng)目的pom.xml都不會(huì)指定Maven版本它們只是依賴你本機(jī)裝的那個(gè)版本去構(gòu)建。如果你貿(mào)然用一個(gè)太新的Maven某些老插件尤其是一些自定義插件或者舊版maven-compiler-plugin可能會(huì)出現(xiàn)兼容問題。而3.8.8在中央倉庫中已經(jīng)積累了海量的適配案例你踩到坑后基本上能找到現(xiàn)成的解決方案。如果把版本升到3.9.x一些冷門報(bào)錯(cuò)連百度都搜不出幾條像樣的結(jié)果——這就是“穩(wěn)定”的真實(shí)含義。2.2 JDK版本與Maven版本對(duì)應(yīng)關(guān)系不匹配引發(fā)的“慢性病”有人會(huì)問“Maven和JDK還有什么對(duì)應(yīng)關(guān)系不是能用就行嗎”這里面的坑屬于典型的“平時(shí)不炸一炸就大事不妙”。Maven本身是Java寫的所以它運(yùn)行需要一個(gè)JRE/JDK環(huán)境。3.8.8要求JDK 8及以上才能運(yùn)行推薦JDK 8或JDK 11。如果你機(jī)器上裝的是JDK 17甚至JDK 21Maven也能跑但這時(shí)候你就要考慮項(xiàng)目本身的編譯目標(biāo)——pom.xml里的maven.compiler.source和maven.compiler.target如果寫的1.8那你用的JDK 17編譯時(shí)雖然可以加--add-opens之類的參數(shù)硬啃下來但很多老項(xiàng)目的反射、動(dòng)態(tài)代理代碼很可能在運(yùn)行時(shí)直接報(bào)InaccessibleObjectException。我曾經(jīng)幫同事排查過一個(gè)服務(wù)啟動(dòng)失敗他JDK 17配的Maven是用Homebrew順手裝的3.9.x項(xiàng)目是SSM架構(gòu)的老系統(tǒng)。啟動(dòng)時(shí)直接拋出模塊訪問限制相關(guān)錯(cuò)誤查了半天最后把JDK換回8或者11問題徹底消失。這并不是說新版不好而是任何工具鏈工作要講究“組合匹配”。如果你的項(xiàng)目是Spring Boot 2.xJDK 8或11是最穩(wěn)的如果項(xiàng)目是Spring Boot 3.x那才需要JDK 17。所以在你執(zhí)行Maven安裝之前先用java -version看一下當(dāng)前生效的JDK是多少不要到后面“你裝的Maven版本和你項(xiàng)目需要的JDK版本錯(cuò)位”再去翻車。3. Maven 3.8.8 下載與安裝實(shí)操Windows macOS3.1 下載入口與壓縮包選擇Maven官網(wǎng)的下載入口是maven.apache.org/download.cgi別看頁面長(zhǎng)得簡(jiǎn)陋上面會(huì)有兩個(gè)主要選項(xiàng)Binary tar.gz archive和Binary zip archive。Windows用戶直接下apache-maven-3.8.8-bin.zipmacOS用戶下tar.gz格式也行zip格式也能解壓其實(shí)兩者內(nèi)容一模一樣只是打包格式不同。還有一種source包那個(gè)是源碼不要下除非你是要自己編譯Maven否則純屬浪費(fèi)表情。下載完不要直接扔到C盤根目錄就完事。我一般會(huì)建議在非系統(tǒng)盤建一個(gè)統(tǒng)一的開發(fā)工具目錄比如Windows下的D:\DevTools\mavenmacOS下的~/DevTools/maven。這樣做的原因有兩個(gè)一是盡量讓路徑里不帶空格和中文避免某些老舊的插件解析路徑時(shí)出現(xiàn)詭異報(bào)錯(cuò)二是以后你需要裝多個(gè)Maven版本做對(duì)比測(cè)試時(shí)目錄結(jié)構(gòu)清晰切換也方便。3.2 Windows環(huán)境變量配置與驗(yàn)證解壓完成后進(jìn)入系統(tǒng)環(huán)境變量設(shè)置。這里有個(gè)細(xì)節(jié)你可以在“系統(tǒng)變量”新建一個(gè)MAVEN_HOME指向解壓后的目錄例如D:\DevTools\apache-maven-3.8.8然后在Path里追加%MAVEN_HOME%\bin。有人會(huì)覺得只配Path就夠了沒必要單獨(dú)配MAVEN_HOME。但是很多第三方工具比如IDEA的Maven Runner、Jenkins的全局配置還是習(xí)慣讀取MAVEN_HOME所以建議保留這一項(xiàng)兼容性最好。配置完成后關(guān)鍵的驗(yàn)證步驟重開一個(gè)CMD窗口千萬不要用舊窗口因?yàn)榄h(huán)境變量不會(huì)自動(dòng)刷新輸入mvn -v看到類似這樣的輸出才算成功Apache Maven 3.8.8 (b4d89b6b5d8b9c8d0e8f...) Maven home: D:\DevTools\apache-maven-3.8.8 Java version: 1.8.0_202, vendor: Oracle Corporation Java home: C:\Program Files\Java\jdk1.8.0_202 Default locale: zh_CN, platform encoding: GBK這里要特別留意platform encoding那一行。如果顯示的是GBK或者ANSI你的項(xiàng)目在編譯時(shí)如果沒有顯式指定編碼就可能出現(xiàn)亂碼問題。推薦設(shè)置一個(gè)系統(tǒng)環(huán)境變量MAVEN_OPTS值為-Dfile.encodingUTF-8可以極大緩解中文系統(tǒng)上Maven輸出和編譯亂碼的“玄學(xué)問題”。我在實(shí)際配置中還發(fā)現(xiàn)過一種情況mvn -v能正常執(zhí)行但是一運(yùn)行mvn clean install就提示“MavenHome is not a directory”。這種多半是環(huán)境變量MAVEN_HOME末尾多了一個(gè)斜杠或者空格Windows的路徑解析會(huì)把它當(dāng)成一個(gè)無效值。所以在修改環(huán)境變量時(shí)要養(yǎng)成好習(xí)慣不要有多余空格不要帶中文路徑不要在路徑末尾加反斜杠。3.3 macOS環(huán)境變量配置與驗(yàn)證macOS上配置Maven核心邏輯和Windows一樣但有個(gè)更簡(jiǎn)便的方法如果你裝了Homebrew直接brew install maven也行但那樣裝的可能不是3.8.8而是Homebrew倉庫里當(dāng)前最新的穩(wěn)定版。如果你想鎖定3.8.8還是建議手動(dòng)下載解壓然后編輯~/.zshrc如果是之前的bash環(huán)境就編輯~/.bash_profile。在~/.zshrc里追加export MAVEN_HOME~/DevTools/apache-maven-3.8.8 export PATH$MAVEN_HOME/bin:$PATH追加完成后執(zhí)行source ~/.zshrc然后運(yùn)行mvn -v。macOS上經(jīng)常出現(xiàn)的坑是“command not found”原因基本是export PATH寫錯(cuò)了順序把Maven的bin目錄放到了$PATH后面導(dǎo)致系統(tǒng)優(yōu)先找到別的路徑下的舊版本。另一種坑是~/.zshrc新開終端時(shí)沒有自動(dòng)加載這是因?yàn)榻K端進(jìn)程是從舊的環(huán)境變量派生的你必須重新開一個(gè)Terminal窗口或者執(zhí)行exec zsh -l重新登錄Shell。mac上還有一點(diǎn)和Windows不同Maven默認(rèn)JDK版本可能不是你需要的版本。你可以通過設(shè)置JAVA_HOME來指定Maven構(gòu)建時(shí)用的JDK。在~/.zshrc里可以動(dòng)態(tài)設(shè)置export JAVA_HOME$(/usr/libexec/java_home -v 11)如果你想在Maven 3.8.8、JDK 8、JDK 11之間快速切換建議不要寫死而是維護(hù)一個(gè)切換腳本。我試過在項(xiàng)目根目錄放一個(gè).env.sh文件里面聲明當(dāng)前項(xiàng)目需要的JAVA_HOME每次構(gòu)建前source一下。這樣比全局寫死靈活太多尤其是你在同一個(gè)電腦上可能同時(shí)維護(hù)Spring Boot 2.1的老項(xiàng)目和Spring Boot 3.1的新項(xiàng)目時(shí)這個(gè)技巧能救你一命。4. 核心中的核心settings.xml配置4.1 本地倉庫路徑為什么要改Maven本地倉庫默認(rèn)在C:\Users\你的用戶名\.m2\repositoryWindows或~/.m2/repositorymacOS/Linux。對(duì)于絕大多數(shù)人這個(gè)默認(rèn)位置都是個(gè)坑。首先C盤容量很容易被依賴包塞滿一個(gè)中型Spring Cloud項(xiàng)目經(jīng)過幾次依賴版本迭代本地倉庫輕松突破10GB。其次以后如果你重裝系統(tǒng)或遷移開發(fā)環(huán)境默認(rèn)路徑下的配置和倉庫清理起來特別麻煩。所以我拿到新的Maven后打開conf/settings.xml第一件事就是找到localRepository這個(gè)標(biāo)簽把它改成你想放的路徑。這里我一般會(huì)在D盤或者macOS的~/DevTools下建一個(gè)maven-repository目錄然后寫成localRepositoryD:\DevTools\maven-repository/localRepository注意localRepository的標(biāo)簽如果注釋掉Maven就會(huì)走默認(rèn)的.m2/repository路徑。很多人在網(wǎng)上看到的教程只會(huì)說“改一下就行”但沒人告訴你改完之后原來的C盤倉庫里的包不會(huì)被自動(dòng)遷移你必須手動(dòng)把舊倉庫里的內(nèi)容復(fù)制到新路徑否則之前下載過的依賴又要重新下一遍。那種體驗(yàn)實(shí)在太痛苦。4.2 阿里云鏡像配置與依賴下載加速M(fèi)aven默認(rèn)從中央倉庫repo.maven.apache.org下載依賴。在國(guó)內(nèi)環(huán)境下中央倉庫的速度時(shí)好時(shí)壞慢的時(shí)候一個(gè)依賴下載能卡到你懷疑人生。這時(shí)候配置阿里云鏡像倉庫是最有效的方案。在settings.xml里的mirrors節(jié)點(diǎn)下添加mirror idaliyunmaven/id mirrorOf*/mirrorOf name阿里云公共倉庫/name urlhttps://maven.aliyun.com/repository/public/url /mirror這段配置的含義是所有倉庫的請(qǐng)求都鏡像指向阿里云的公共倉庫地址。如果你有多個(gè)私服或者特殊倉庫需求比如公司內(nèi)部Nexus倉庫不要用mirrorOf*/mirrorOf而是要根據(jù)倉庫id做精細(xì)化配置。阿里云的這個(gè)公共倉庫已經(jīng)聚合了Maven中央倉庫、JCenter、Google等多部分內(nèi)容對(duì)于日常Java項(xiàng)目開發(fā)夠用了。實(shí)際用下來阿里云鏡像在晚高峰、下班高峰期表現(xiàn)依然穩(wěn)定但偶爾也會(huì)出現(xiàn)報(bào)錯(cuò)Could not transfer artifact ... Connection reset。這種情況不用緊張多半是網(wǎng)絡(luò)抖動(dòng)導(dǎo)致的瞬時(shí)失敗直接重新執(zhí)行構(gòu)建命令就好。如果你在做持續(xù)集成建議在settings.xml中配置重試機(jī)制例如在mirrors后面加上profiles profile idaliyun/id repositories repository idaliyun-public/id urlhttps://maven.aliyun.com/repository/public/url releases enabledtrue/enabled /releases snapshots enabledtrue/enabled /snapshots /repository /repositories /profile /profiles activeProfiles activeProfilealiyun/activeProfile /activeProfiles這樣可以確保一些沒有在mirrors層生效的倉庫請(qǐng)求也能走阿里云。很多人配了鏡像但下載速度還是跟蝸牛一樣大概率就是只配了mirrors而沒加activeProfile或者兩者配置的倉庫id不一致依賴被同時(shí)請(qǐng)求了多個(gè)倉庫源。4.3 多鏡像倉庫與私服Nexus共存的心得如果你的公司使用了Nexus私服并且你需要同時(shí)訪問公司私服和阿里云鏡像就不要再讓mirrorOf匹配所有倉庫了。比如你有一個(gè)公司的私服倉庫id是nexus-repo那么可以這樣配mirror idaliyunmaven/id mirrorOf*,!nexus-repo/mirrorOf urlhttps://maven.aliyun.com/repository/public/url /mirror這里的!nexus-repo表示排除這個(gè)私服倉庫。同時(shí)在profiles中把公司私服的repository配置好。這個(gè)組合在實(shí)際企業(yè)開發(fā)中非常常見但很多教程壓根沒講。如果你不做這個(gè)排除配置公司私服里的內(nèi)部構(gòu)件要么下載失敗要么被阿里云鏡像強(qiáng)制代理導(dǎo)致鑒權(quán)失敗排查起來煩死人。還有一個(gè)小技巧在settings.xml中配置servers節(jié)點(diǎn)如果私服需要賬號(hào)密碼可以在這里維護(hù)。Maven對(duì)服務(wù)器密碼保存會(huì)做加密需要配置settings-security.xml來解密這個(gè)操作比較麻煩但如果你是在本地開發(fā)環(huán)境使用直接明文填寫也無妨。如果是在公司統(tǒng)一托管環(huán)境里建議詢問運(yùn)維是否有獨(dú)立的安全配置規(guī)范。5. 本地倉庫、IDEA集成與Maven項(xiàng)目實(shí)戰(zhàn)5.1 IDEA中如何使用自己安裝的Maven而不是內(nèi)置的IDEA確實(shí)自帶了Maven但自帶版本通常落后于你手動(dòng)安裝的版本而且它默認(rèn)使用的settings.xml是IDEA目錄下的一個(gè)內(nèi)部配置文件。如果你直接用IDEA默認(rèn)配置你會(huì)發(fā)現(xiàn)自己在conf/settings.xml里做的鏡像、本地倉庫配置基本不起作用——因?yàn)镮DEA根本沒有讀取那個(gè)配置文件。正確的做法打開IDEA的Settings搜索Maven找到Maven home path選擇你手動(dòng)安裝的3.8.8目錄然后在User settings file中指定到你的settings.xml路徑勾選Override。這一步非常關(guān)鍵很多人明明在命令行里mvn install好好的到了IDEA里就瘋狂報(bào)“Could not find artifact”十有八九就是IDEA還在使用它自帶的Maven和空白的settings.xml。此外IDEA的Runner設(shè)置中有一項(xiàng)Environment variables建議加上JAVA_HOME指向?qū)?yīng)JDK并設(shè)置MAVEN_OPTS為-Xmx1024m等參數(shù)避免大型項(xiàng)目編譯時(shí)內(nèi)存不足。實(shí)測(cè)下來一個(gè)包含幾十個(gè)微服務(wù)模塊的工程在IDEA中構(gòu)建時(shí)默認(rèn)的512MB堆內(nèi)存根本不夠用OOM報(bào)錯(cuò)只是時(shí)間問題。5.2 用Maven 3.8.8構(gòu)建一個(gè)命令行clean install工程這節(jié)適合所有剛配好Maven的人去驗(yàn)證自己的環(huán)境是否“真的能用”。隨便找一個(gè)已有的Maven項(xiàng)目或者自己建一個(gè)最簡(jiǎn)單的webapp然后在項(xiàng)目根目錄執(zhí)行mvn clean install觀察控制臺(tái)日志重點(diǎn)關(guān)注這幾個(gè)階段downloading ...階段如果日志卡在下載階段說明鏡像配置有問題需要回去檢查settings.xml的url到底是http還是https。阿里云要求用https用http會(huì)得到301重定向新版本的Maven出于安全考慮會(huì)直接拒絕。compiling階段如果編譯報(bào)錯(cuò)先看JDK版本是否匹配。我在前面強(qiáng)調(diào)過Maven 3.8.8配合JDK 8和11最穩(wěn)你非要用JDK 17就需要在pom.xml中顯式聲明java.version為17同時(shí)升級(jí)maven-compiler-plugin到3.10.0以上。這是很多人“mvn install失敗”的隱藏原因。package和install階段成功后在target目錄下會(huì)生成Jar包或War包。這里分享一個(gè)我自己的習(xí)慣在CI/CD環(huán)境或者需要快速驗(yàn)證依賴是否完整時(shí)我會(huì)直接執(zhí)行mvn clean install -DskipTests跳過測(cè)試可以大幅縮短構(gòu)建時(shí)間但在本地開發(fā)還是建議不要頻繁跳過單元測(cè)試畢竟測(cè)試也是一種對(duì)依賴配置的驗(yàn)證。你可以配合-pl參數(shù)只構(gòu)建指定模塊比如mvn clean install -pl user-service -am-am的意思是also make會(huì)同時(shí)構(gòu)建被依賴的前置模塊。這個(gè)組合在多模塊項(xiàng)目中效率極高比每次構(gòu)建整個(gè)工程快好幾個(gè)數(shù)量級(jí)。5.3 常見紅線不要在JDK與Maven版本上“自由發(fā)揮”我在幫人排查問題的時(shí)候發(fā)現(xiàn)很多人會(huì)用IDEA的Project Structure隨意切換SDK版本但Maven的編譯行為是獨(dú)立的——它遵行的不是IDEA的Project SDK而是JAVA_HOME和pom.xml里maven.compiler.source/target的配置。如果你感覺IDEA里面一切正常但命令行mvn clean install就是各種報(bào)錯(cuò)優(yōu)先檢查mvn -v顯示的Java版本是不是你預(yù)期的那個(gè)。還有一個(gè)紅線不要用install階段的pluginManagement去隨意覆蓋中央插件版本尤其是maven-surefire-plugin和maven-compiler-plugin。它們和JDK版本的搭配有著嚴(yán)格的兼容性矩陣如果你在pom.xml里硬指定一個(gè)過老的maven-compiler-plugin版本而JDK是17編譯階段會(huì)直接報(bào)“invalid source release”。我建議初次使用Maven 3.8.8時(shí)先不要畫蛇添足改這些插件的版本讓Maven使用它默認(rèn)綁定的插件版本跑通了再考慮優(yōu)化。6. 實(shí)戰(zhàn)過程中我踩過、你也可能會(huì)踩的坑6.1 maven下載依賴報(bào)錯(cuò)“Could not transfer artifact”的排查順序這個(gè)報(bào)錯(cuò)應(yīng)該是出現(xiàn)頻率最高的問題了。我剛裝好Maven那會(huì)兒跑到一個(gè)老項(xiàng)目里執(zhí)行mvn clean結(jié)果一堆依賴報(bào)傳輸錯(cuò)誤。我的排查邏輯分享給你第一步先確認(rèn)網(wǎng)絡(luò)能不能連通Maven倉庫地址比如用瀏覽器訪問https://maven.aliyun.com/repository/public如果能訪問說明網(wǎng)絡(luò)沒問題。第二步確認(rèn)是不是SSL證書問題。Maven 3.8.8對(duì)證書校驗(yàn)比舊版嚴(yán)格如果你配置的倉庫地址是http而不是https或者公司內(nèi)網(wǎng)使用了自簽名證書那么會(huì)在握手階段直接失敗。這時(shí)候可以在settings.xml里給MAVEN_OPTS加上-Dmaven.wagon.http.ssl.insecuretrue但注意這只適合內(nèi)網(wǎng)測(cè)試生產(chǎn)環(huán)境別這么干。第三步確認(rèn)本地倉庫是否有半成品文件。Maven下載過程中如果遇到斷網(wǎng)會(huì)在本地倉庫留下.lastUpdated后綴的文件這會(huì)導(dǎo)致下次構(gòu)建時(shí)Maven誤以為已經(jīng)嘗試過下載但失敗從而不再發(fā)起新請(qǐng)求。解決辦法是把repository目錄中所有.lastUpdated文件刪掉或者用一個(gè)命令清理持久化失敗的記錄find ~/.m2/repository -name *.lastUpdated -type f -delete這個(gè)命令在macOS/Linux下非常好用。Windows下可以用PowerShell的Get-ChildItem -Recurse | Where-Object { $_.Name -like *.lastUpdated } | Remove-Item。但如果你已經(jīng)配置了自定義本地倉庫記得把路徑替換成你的倉庫路徑。6.2 配置了阿里云鏡像但依賴還是很慢不一定是鏡像的鍋有段時(shí)間我開發(fā)一個(gè)Spring Cloud Alibaba項(xiàng)目依賴特別多配置了阿里云鏡像后第一次構(gòu)建仍然花了二十多分鐘。我以為是鏡像失效了后來盯著控制臺(tái)才發(fā)現(xiàn)卡住的不是外部依賴而是公司私服里的內(nèi)部構(gòu)件——因?yàn)槲以趍irrorOf中用了*把所有請(qǐng)求都轉(zhuǎn)發(fā)到了阿里云結(jié)果公司私服的jar包在阿里云上不存在Maven反復(fù)重試直到超時(shí)。解決方法是回到第4.3節(jié)說的排除規(guī)則用*,!nexus-repo這種寫法。此外還有一個(gè)不起眼但影響巨大的參數(shù)id的命名。Maven判定鏡像是否生效并不完全看url還要看鏡像倉庫的id是否和目標(biāo)倉庫id一致。很多人在網(wǎng)上復(fù)制配置根本沒看id的值結(jié)果是鏡像配置存在但從未真正生效。判斷方法很簡(jiǎn)單執(zhí)行mvn help:effective-settings它會(huì)列出你最終生效的settings.xml內(nèi)容檢查mirror節(jié)點(diǎn)是否和實(shí)際請(qǐng)求匹配。6.3 IDEA和命令行構(gòu)建結(jié)果不一致的真相同一個(gè)項(xiàng)目命令行mvn clean install成功IDEA構(gòu)建卻報(bào)錯(cuò)或者反過來IDEA能構(gòu)建命令行徹底失敗。這種“陰陽兩隔”的現(xiàn)象十個(gè)里有九個(gè)是因?yàn)镸aven的執(zhí)行者不一樣。IDEA默認(rèn)是多模塊遞歸構(gòu)建它調(diào)用Maven時(shí)會(huì)把-T 1C之類的并行參數(shù)加進(jìn)去還會(huì)自動(dòng)設(shè)置-Dmaven.repo.local從Maven設(shè)置面板讀取本地倉庫路徑。如果你在IDEA的Maven設(shè)置面板中填寫的路徑和你命令行settings.xml里配置的localRepository不一致那么兩個(gè)環(huán)境會(huì)各自使用不同的本地倉庫緩存表面看起來都是報(bào)“missing artifact”實(shí)際行為卻完全不同。排查這類問題我建議你在IDEA中進(jìn)入Help - Show Log in Explorer查看IDEA日志中maven插件的執(zhí)行具體參數(shù)你就能看到它到底加了什么、用了哪個(gè)settings.xml。6.4 安裝完Maven后執(zhí)行mvn -v出現(xiàn)“不是內(nèi)部或外部命令”這個(gè)典型問題通常出現(xiàn)在Windows上常見原因有兩個(gè)一是環(huán)境變量配置完成后打開的CMD窗口是舊的沒有加載新變量二是系統(tǒng)變量的Path中%MAVEN_HOME%\bin的先后順序出現(xiàn)問題——如果Path中其他目錄里有一個(gè)同名mvn.cmd或者系統(tǒng)里存在另一個(gè)Maven包CMD會(huì)根據(jù)順序優(yōu)先執(zhí)行先命中的那個(gè)。解決辦法確認(rèn)echo %MAVEN_HOME%能打印正確路徑然后where mvn查看到底找到的是哪個(gè)路徑下的mvn。macOS用戶如果出現(xiàn)command not found優(yōu)先檢查~/.zshrc是否有權(quán)限問題或者語法錯(cuò)誤比如export PATH$MAVEN_HOME/bin:$PATH寫成了export PATH$PATH:$MAVEN_HOME/bin前者優(yōu)先使用Maven的bin目錄而后者如果你當(dāng)前環(huán)境變量里已經(jīng)有一個(gè)舊Maven路徑可能會(huì)被舊版本“劫持”。7. 給不同使用場(chǎng)景的最終建議如果你只是做一個(gè)Spring Boot的學(xué)習(xí)項(xiàng)目Maven 3.8.8加上阿里云鏡像十分鐘內(nèi)就能搞定環(huán)境用起來完全夠。如果你是企業(yè)開發(fā)或老項(xiàng)目維護(hù)請(qǐng)多留意JDK版本和插件版本盡量不要在Maven本身做激進(jìn)升級(jí)。如果你是長(zhǎng)期從事Java開發(fā)的工程師我強(qiáng)烈建議你好好讀一遍settings.xml里的注釋那些英文注釋雖然啰嗦但一個(gè)字一個(gè)字看完你對(duì)Maven的理解會(huì)上一個(gè)臺(tái)階。最后分享一下我現(xiàn)在的工作習(xí)慣在每臺(tái)開發(fā)機(jī)上我會(huì)把Maven的settings.xml放在一個(gè)獨(dú)立目錄比如~/maven-conf/settings.xml然后通過MAVEN_HOME和IDE配置同時(shí)指向它。這樣不管我在哪臺(tái)機(jī)器、哪個(gè)項(xiàng)目上工作行為都保持一致。配置里面除了本地倉庫、鏡像我還會(huì)把offline設(shè)置為false因?yàn)槲也幌M鸐aven在倉庫緩存崩潰時(shí)自動(dòng)進(jìn)入離線狀態(tài)那會(huì)讓后續(xù)排查變成“大海撈針”。Maven 3.8.8的安裝只是起點(diǎn)真正要花時(shí)間去琢磨的是你怎么通過依賴管理把項(xiàng)目從“能跑”變成“能長(zhǎng)期維護(hù)”。環(huán)境搭好后找一個(gè)小項(xiàng)目親手跑幾遍clean install把下載、編譯、打包、安裝的日志從頭到尾看一遍你會(huì)收獲比任何教程都多的實(shí)踐經(jīng)驗(yàn)。