級(jí)最佳實(shí)踐)
1. 項(xiàng)目概述為什么你的Maven配置總是不對(duì)勁如果你剛接觸Java開(kāi)發(fā)或者從別的構(gòu)建工具轉(zhuǎn)過(guò)來(lái)第一次打開(kāi)Maven的settings.xml配置文件大概率會(huì)有點(diǎn)懵。這個(gè)文件里一堆標(biāo)簽什么mirrors、profiles、servers看起來(lái)都差不多但改錯(cuò)一個(gè)地方可能就導(dǎo)致依賴死活下載不下來(lái)或者構(gòu)建速度慢如蝸牛。網(wǎng)上的教程要么太老要么只給個(gè)片段你照著配了在自己的環(huán)境里卻跑不通這種挫敗感我太懂了。我干了十多年Java后端帶過(guò)不少新人發(fā)現(xiàn)90%的Maven問(wèn)題根源都出在配置上而且不是配置本身錯(cuò)了是配置和你的實(shí)際環(huán)境、網(wǎng)絡(luò)狀況、項(xiàng)目需求不匹配。今天這篇我就從一個(gè)老碼農(nóng)的視角給你拆解Maven配置的里里外外。這不是一份冷冰冰的官方文檔翻譯而是我踩過(guò)無(wú)數(shù)坑之后總結(jié)出的“生存指南”。我會(huì)告訴你每個(gè)配置項(xiàng)背后的設(shè)計(jì)意圖在什么場(chǎng)景下必須改怎么改才最穩(wěn)妥以及那些官方文檔里不會(huì)寫(xiě)的“潛規(guī)則”。目標(biāo)是讓你配完一次未來(lái)三五年都不用再為Maven的配置問(wèn)題頭疼。2. 核心配置文件settings.xml的深度解剖Maven的配置核心就兩個(gè)文件項(xiàng)目級(jí)的pom.xml和全局或用戶級(jí)的settings.xml。pom.xml定義項(xiàng)目本身而settings.xml則定義構(gòu)建環(huán)境。很多人把兩者搞混把該放在settings.xml里的東西如私服認(rèn)證寫(xiě)進(jìn)了pom.xml導(dǎo)致配置無(wú)法復(fù)用安全性也有問(wèn)題。2.1 文件位置與優(yōu)先級(jí)別找錯(cuò)了地方首先你必須清楚Maven會(huì)按順序讀取哪些settings.xml文件優(yōu)先級(jí)高的會(huì)覆蓋低的。這是排查“我明明改了配置為什么沒(méi)生效”問(wèn)題的第一步。全局配置(${maven.home}/conf/settings.xml)這是Maven安裝目錄下的配置影響所有使用該Maven的用戶。強(qiáng)烈不建議直接修改這個(gè)文件。因?yàn)楦翸aven版本時(shí)這個(gè)文件可能會(huì)被覆蓋。你應(yīng)該把它當(dāng)作一個(gè)默認(rèn)模板。用戶配置(${user.home}/.m2/settings.xml)這是每個(gè)用戶獨(dú)立的配置優(yōu)先級(jí)高于全局配置。我們99%的個(gè)性化配置都應(yīng)該放在這里。${user.home}就是你的用戶目錄在Windows上是C:\Users\你的用戶名\.m2\在Linux/macOS上是/home/你的用戶名/.m2/或/Users/你的用戶名/.m2/。如果這個(gè)文件不存在就自己創(chuàng)建一個(gè)。命令行指定(-s /path/to/settings.xml)通過(guò)Maven命令的-s參數(shù)可以指定一個(gè)特定的配置文件優(yōu)先級(jí)最高。常用于多環(huán)境如開(kāi)發(fā)、測(cè)試、生產(chǎn)構(gòu)建每個(gè)環(huán)境對(duì)應(yīng)不同的settings.xml。注意.m2目錄也是Maven的本地倉(cāng)庫(kù)默認(rèn)位置。所以你的settings.xml和下載的所有jar包都在同一個(gè)父目錄下備份或遷移時(shí)要注意。2.2 配置文件骨架與核心章節(jié)一個(gè)完整的settings.xml結(jié)構(gòu)如下。我會(huì)逐一解釋每個(gè)部分的作用哪些是必配的哪些是可選的。?xml version1.0 encodingUTF-8? settings xmlnshttp://maven.apache.org/SETTINGS/1.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd !-- 本地倉(cāng)庫(kù)路徑 -- localRepository/ !-- 交互模式開(kāi)關(guān) -- interactiveMode/ !-- 離線模式開(kāi)關(guān) -- offline/ !-- 插件組 -- pluginGroups/ !-- 服務(wù)器認(rèn)證信息 -- servers/ !-- 鏡像配置 -- mirrors/ !-- 代理配置 -- proxies/ !-- 環(huán)境 profiles -- profiles/ !-- 激活的 profile -- activeProfiles/ /settings3. 鏡像與倉(cāng)庫(kù)配置解決下載慢和404的終極方案這是國(guó)內(nèi)開(kāi)發(fā)者最關(guān)心的部分。默認(rèn)的中央倉(cāng)庫(kù)repo1.maven.org在國(guó)外速度慢且不穩(wěn)定。配置鏡像倉(cāng)庫(kù)是提升構(gòu)建速度的第一步也是最關(guān)鍵的一步。3.1 鏡像Mirrors給倉(cāng)庫(kù)找個(gè)“替身”鏡像不是一個(gè)獨(dú)立的倉(cāng)庫(kù)而是對(duì)某個(gè)倉(cāng)庫(kù)的攔截和重定向。當(dāng)Maven向倉(cāng)庫(kù)A發(fā)起請(qǐng)求時(shí)如果配置了鏡像指向倉(cāng)庫(kù)B那么請(qǐng)求會(huì)被自動(dòng)轉(zhuǎn)發(fā)到倉(cāng)庫(kù)B。mirrors mirror idaliyunmaven/id name阿里云公共倉(cāng)庫(kù)/name urlhttps://maven.aliyun.com/repository/public/url mirrorOfcentral/mirrorOf /mirror /mirrorsid: 鏡像的唯一標(biāo)識(shí)自己起個(gè)名字就行。url: 鏡像倉(cāng)庫(kù)的地址。mirrorOf: 這是靈魂配置決定了鏡像替身誰(shuí)。central: 只鏡像Maven中央倉(cāng)庫(kù)。這是最常用、最安全的配置。*: 鏡像所有倉(cāng)庫(kù)請(qǐng)求。這個(gè)配置非常危險(xiǎn)如果你還配置了公司的私有倉(cāng)庫(kù)nexus這個(gè)設(shè)置會(huì)導(dǎo)致連私有倉(cāng)庫(kù)的請(qǐng)求也被轉(zhuǎn)發(fā)到阿里云而阿里云上沒(méi)有你的私有jar包結(jié)果就是構(gòu)建失敗。除非你非常清楚自己在做什么否則不要用*。external:*: 鏡像所有不在本機(jī)即非file://協(xié)議的倉(cāng)庫(kù)。比*稍好但仍有風(fēng)險(xiǎn)。repo1,repo2: 鏡像指定的倉(cāng)庫(kù)id即repository標(biāo)簽里的id。*,!repo1: 鏡像除repo1之外的所有倉(cāng)庫(kù)。這種語(yǔ)法可以用于排除。實(shí)操心得對(duì)于大多數(shù)國(guó)內(nèi)個(gè)人開(kāi)發(fā)者只配一個(gè)鏡像mirrorOfcentral/mirrorOf就夠了。如果你在公司需要連接內(nèi)網(wǎng)私服通常會(huì)配兩個(gè)鏡像一個(gè)指向阿里云鏡像中央倉(cāng)庫(kù)另一個(gè)指向公司私服鏡像其他倉(cāng)庫(kù)或者使用更精確的mirrorOf規(guī)則。3.2 倉(cāng)庫(kù)Repositories與插件倉(cāng)庫(kù)PluginRepositories倉(cāng)庫(kù)聲明通常定義在項(xiàng)目的pom.xml里。但在settings.xml的profiles中也可以定義用于給特定環(huán)境如公司內(nèi)部添加全局倉(cāng)庫(kù)。profiles profile idmy-company-profile/id repositories repository idcompany-nexus/id nameCompany Nexus Repository/name urlhttp://nexus.mycompany.com/repository/maven-public//url releases enabledtrue/enabled updatePolicydaily/updatePolicy !-- 更新策略 -- checksumPolicywarn/checksumPolicy /releases snapshots enabledfalse/enabled !-- 公司倉(cāng)庫(kù)通常禁用snapshots由獨(dú)立倉(cāng)庫(kù)管理 -- /snapshots /repository /repositories /profile /profiles activeProfiles activeProfilemy-company-profile/activeProfile /activeProfiles關(guān)鍵參數(shù)解析releases/snapshots: 分別控制正式版和快照版構(gòu)件的下載策略??煺瞻?SNAPSHOT是開(kāi)發(fā)中的不穩(wěn)定版本更新頻率高。updatePolicy: 控制Maven檢查遠(yuǎn)程倉(cāng)庫(kù)更新的頻率。always: 每次構(gòu)建都檢查。daily(默認(rèn)): 每天檢查一次。interval:X: 每隔X分鐘檢查一次。never: 從不檢查遠(yuǎn)程更新只使用本地緩存。在離線或追求極致構(gòu)建速度時(shí)可用但可能導(dǎo)致無(wú)法獲取最新依賴。checksumPolicy: 當(dāng)構(gòu)件校驗(yàn)和不匹配時(shí)的策略。fail失敗、warn警告、ignore忽略。通常用warn在遇到問(wèn)題時(shí)能給出提示。踩坑記錄有一次團(tuán)隊(duì)構(gòu)建失敗報(bào)錯(cuò)找不到某個(gè)公共jar包。排查了半天發(fā)現(xiàn)是有同事在settings.xml里配了一個(gè)錯(cuò)誤的repository其url指向了一個(gè)已經(jīng)不存在的地址并且這個(gè)倉(cāng)庫(kù)的優(yōu)先級(jí)被設(shè)得很高。Maven在查找依賴時(shí)會(huì)按順序遍歷所有已啟用的倉(cāng)庫(kù)直到找到為止。那個(gè)錯(cuò)誤倉(cāng)庫(kù)排在前面Maven先去請(qǐng)求它得到404或超時(shí)整個(gè)構(gòu)建流程就卡住了。教訓(xùn)是謹(jǐn)慎添加第三方倉(cāng)庫(kù)并確保其可用性。4. 服務(wù)器、代理與本地倉(cāng)庫(kù)構(gòu)建環(huán)境的精細(xì)調(diào)優(yōu)4.1 服務(wù)器認(rèn)證Servers安全地連接私服如果你的鏡像或倉(cāng)庫(kù)需要用戶名密碼比如公司的Nexus私服絕對(duì)不能把密碼明文寫(xiě)在pom.xml里。servers標(biāo)簽就是用來(lái)安全存儲(chǔ)認(rèn)證信息的。servers server idcompany-nexus/id !-- 必須與repository或mirror的id對(duì)應(yīng) -- usernamedeployer/username password{加密后的密碼}/password /server /servers這里有個(gè)超級(jí)重要的技巧password可以寫(xiě)明文但更安全的方式是使用Maven的密碼加密功能。在${user.home}/.m2/目錄下創(chuàng)建一個(gè)settings-security.xml文件里面設(shè)置一個(gè)主密碼。使用命令mvn --encrypt-password來(lái)加密你的倉(cāng)庫(kù)密碼然后將加密后的字符串以{開(kāi)頭}結(jié)尾填入password標(biāo)簽。為什么id必須對(duì)應(yīng)當(dāng)Maven需要訪問(wèn)一個(gè)id為company-nexus的倉(cāng)庫(kù)時(shí)它會(huì)自動(dòng)在servers列表里尋找同id的server配置并使用其中的認(rèn)證信息。這個(gè)設(shè)計(jì)實(shí)現(xiàn)了認(rèn)證信息與倉(cāng)庫(kù)聲明的解耦。4.2 代理Proxies應(yīng)對(duì)公司網(wǎng)絡(luò)隔離很多公司的開(kāi)發(fā)機(jī)不能直接訪問(wèn)外網(wǎng)需要通過(guò)代理。Maven也支持代理配置。proxies proxy idmy-company-proxy/id activetrue/active protocolhttp/protocol hostproxy.mycompany.com/host port8080/port usernameproxyuser/username !-- 如果需要認(rèn)證 -- passwordproxypass/password nonProxyHostslocalhost|127.0.0.1|*.mycompany.com/nonProxyHosts /proxy /proxiesnonProxyHosts: 這個(gè)配置非常有用它指定哪些主機(jī)名不走代理使用管道符|分隔。通常會(huì)把公司內(nèi)網(wǎng)域名如*.mycompany.com和本地回環(huán)地址加進(jìn)去避免內(nèi)網(wǎng)請(qǐng)求也被繞到外網(wǎng)代理導(dǎo)致訪問(wèn)內(nèi)網(wǎng)私服變慢或失敗。4.3 本地倉(cāng)庫(kù)LocalRepository換個(gè)地方存“寶藏”默認(rèn)本地倉(cāng)庫(kù)在~/.m2/repository。你可以把它改到空間更大的磁盤或者一個(gè)所有項(xiàng)目共享的位置團(tuán)隊(duì)協(xié)作時(shí)需注意文件鎖問(wèn)題。localRepositoryD:\maven-repository/localRepository注意事項(xiàng)路徑不要包含中文或特殊字符。修改路徑后新的倉(cāng)庫(kù)是空的需要重新下載所有依賴。你可以將舊倉(cāng)庫(kù)目錄下的內(nèi)容全部拷貝到新路徑。如果你用IDE如IntelliJ IDEA修改了settings.xml后務(wù)必在IDE的Maven設(shè)置中重新指定該配置文件路徑并重啟否則IDE可能還在用舊的配置和本地倉(cāng)庫(kù)。5. 多環(huán)境構(gòu)建與Profile實(shí)戰(zhàn)一套配置應(yīng)對(duì)所有場(chǎng)景這是Maven配置中最強(qiáng)大也最易用錯(cuò)的部分。Profile允許你定義多套構(gòu)建配置并根據(jù)環(huán)境激活其中一套。5.1 定義Profiles區(qū)分開(kāi)發(fā)、測(cè)試與生產(chǎn)我們通常在settings.xml里定義與環(huán)境強(qiáng)相關(guān)的配置比如不同環(huán)境的私服地址、數(shù)據(jù)庫(kù)連接參數(shù)通過(guò)屬性傳遞等。profiles !-- Profile 1: 開(kāi)發(fā)環(huán)境 -- profile iddev/id properties envdevelopment/env database.urljdbc:mysql://localhost:3306/app_db/database.url /properties repositories !-- 開(kāi)發(fā)環(huán)境可能使用更多的快照倉(cāng)庫(kù) -- /repositories /profile !-- Profile 2: 生產(chǎn)環(huán)境 -- profile idprod/id properties envproduction/env database.urljdbc:mysql://prod-db.cluster:3306/app_db/database.url /properties repositories !-- 生產(chǎn)環(huán)境只使用穩(wěn)定的發(fā)布倉(cāng)庫(kù) -- /repositories /profile /profiles5.2 激活Profiles多種靈活的觸發(fā)方式定義了Profile還需要告訴Maven在什么時(shí)候激活它。在settings.xml中默認(rèn)激活activeProfiles activeProfiledev/activeProfile /activeProfiles這會(huì)讓devprofile在每次構(gòu)建時(shí)都生效。不推薦將生產(chǎn)環(huán)境配置設(shè)為默認(rèn)激活?;诃h(huán)境變量激活推薦profiles profile idprod/id activation property nameenv/name valueprod/value /property /activation ... /profile /profiles然后在構(gòu)建時(shí)通過(guò)命令行傳遞參數(shù)mvn clean package -Denvprod。這種方式最清晰也最符合持續(xù)集成/持續(xù)部署CI/CD的實(shí)踐?;诓僮飨到y(tǒng)激活activation os nameWindows 10/name familyWindows/family archamd64/arch /os /activation可以為不同操作系統(tǒng)的開(kāi)發(fā)者配置特定的路徑或工具。基于文件是否存在激活activation file exists${user.home}/.config/use-company-repo/exists /file /activation例如當(dāng)檢測(cè)到某個(gè)標(biāo)志文件時(shí)自動(dòng)激活公司內(nèi)部網(wǎng)絡(luò)的配置。實(shí)戰(zhàn)技巧我通常會(huì)在settings.xml里配置兩套mirrors和repositories一套用mirrorOfcentral/mirrorOf指向阿里云用于外網(wǎng)開(kāi)發(fā)另一套指向公司私服用于內(nèi)網(wǎng)。然后通過(guò)一個(gè)環(huán)境變量如INTERNAL_NETWORK來(lái)切換激活的profile實(shí)現(xiàn)環(huán)境自適應(yīng)。6. 高級(jí)配置與性能調(diào)優(yōu)從能用變到好用基礎(chǔ)配置能讓你跑起來(lái)但高級(jí)配置能讓你跑得飛快且穩(wěn)定。6.1 插件組PluginGroups簡(jiǎn)化插件命令有些Maven插件的前綴prefix比較長(zhǎng)比如org.codehaus.mojo:exec-maven-plugin它的目標(biāo)是exec:java。你可以通過(guò)插件組來(lái)縮短命令。pluginGroups pluginGrouporg.codehaus.mojo/pluginGroup /pluginGroups配置后你就可以直接用mvn exec:java而不需要寫(xiě)完整的org.codehaus.mojo:exec-maven-plugin:3.0.0:java。Maven會(huì)自動(dòng)在配置的組里搜索插件。6.2 內(nèi)存與并發(fā)設(shè)置加速大型項(xiàng)目構(gòu)建Maven構(gòu)建尤其是多模塊項(xiàng)目是內(nèi)存和CPU密集型操作。調(diào)整JVM參數(shù)可以顯著提升性能。這些配置不在settings.xml里而是在環(huán)境變量MAVEN_OPTS或直接修改Maven啟動(dòng)腳本mvn或mvn.cmd。Linux/macOS:export MAVEN_OPTS-Xmx2048m -Xms1024m -XX:MaxMetaspaceSize512m -XX:TieredCompilation -XX:UseG1GCWindows:set MAVEN_OPTS-Xmx2048m -Xms1024m -XX:MaxMetaspaceSize512m -XX:TieredCompilation -XX:UseG1GC-Xmx2048m -Xms1024m將JVM最大堆內(nèi)存設(shè)為2GB初始堆內(nèi)存1GB避免構(gòu)建中途頻繁GC。-XX:MaxMetaspaceSize512m限制元空間大小防止加載大量類時(shí)內(nèi)存溢出。-XX:TieredCompilation -XX:UseG1GC使用G1垃圾收集器并啟用分層編譯適合需要快速啟動(dòng)和中等暫停時(shí)間的構(gòu)建任務(wù)。此外使用Maven 3.x的并行構(gòu)建功能mvn -T 4 clean install。這里的-T 4表示使用4個(gè)線程并行構(gòu)建模塊。對(duì)于模塊間依賴關(guān)系清晰的項(xiàng)目能大幅縮短構(gòu)建時(shí)間。但要注意如果模塊間有嚴(yán)格的順序依賴并行構(gòu)建可能會(huì)失敗。6.3 依賴解析與沖突規(guī)避Maven的依賴傳遞機(jī)制是一把雙刃劍。它自動(dòng)管理依賴但也容易引入沖突。雖然依賴主要在pom.xml中管理但settings.xml中的配置會(huì)影響依賴解析的行為。鏡像倉(cāng)庫(kù)的穩(wěn)定性一個(gè)不穩(wěn)定的鏡像倉(cāng)庫(kù)會(huì)導(dǎo)致依賴下載失敗進(jìn)而導(dǎo)致構(gòu)建失敗。選擇阿里云、騰訊云等國(guó)內(nèi)大廠的鏡像穩(wěn)定性遠(yuǎn)高于個(gè)人搭建的鏡像。離線模式offlineofflinetrue/offline會(huì)強(qiáng)制Maven只使用本地倉(cāng)庫(kù)不檢查任何遠(yuǎn)程更新。在飛機(jī)上、網(wǎng)絡(luò)極差的環(huán)境下或者為了確保構(gòu)建的一致性完全基于本地已下載的依賴可以開(kāi)啟此模式。但長(zhǎng)期開(kāi)啟會(huì)導(dǎo)致無(wú)法獲取新依賴。使用dependency:tree分析當(dāng)遇到ClassNotFoundException或NoSuchMethodError時(shí)第一反應(yīng)應(yīng)該是運(yùn)行mvn dependency:tree查看依賴樹(shù)定位沖突的版本。然后在pom.xml中使用exclusions或dependencyManagement來(lái)解決。7. 企業(yè)級(jí)最佳實(shí)踐與避坑指南結(jié)合多年團(tuán)隊(duì)協(xié)作的經(jīng)驗(yàn)我總結(jié)出以下配置準(zhǔn)則能幫你避開(kāi)絕大多數(shù)坑。7.1 團(tuán)隊(duì)統(tǒng)一配置管理提供標(biāo)準(zhǔn)的settings.xml模板團(tuán)隊(duì)?wèi)?yīng)該維護(hù)一個(gè)基礎(chǔ)的settings.xml模板包含公司私服地址、統(tǒng)一的鏡像配置等。新成員入職時(shí)直接復(fù)制到~/.m2/目錄下即可。區(qū)分環(huán)境配置模板中應(yīng)使用profiles定義好dev、test、prod等環(huán)境并通過(guò)注釋說(shuō)明如何激活例如在CI/CD腳本中設(shè)置-Denvprod。避免每個(gè)人自己亂改。敏感信息加密要求將連接私服的密碼加密存儲(chǔ)使用settings-security.xml并將加密方法寫(xiě)入團(tuán)隊(duì)文檔。7.2 CI/CD流水線中的配置在Jenkins、GitLab CI等持續(xù)集成環(huán)境中Maven配置需要特別注意使用獨(dú)立的settings.xml為CI服務(wù)器專門準(zhǔn)備一個(gè)settings.xml其中只包含構(gòu)建所需的最小配置特別是用于部署deploy到私服的server認(rèn)證信息。通過(guò)環(huán)境變量注入密碼更安全的做法是不在settings.xml中寫(xiě)死密碼而是在CI/CD系統(tǒng)的“Secret Variables”中設(shè)置密碼然后在構(gòu)建腳本中通過(guò)環(huán)境變量MAVEN_OPTS或修改settings.xml文件的方式動(dòng)態(tài)注入。例如在Shell腳本中# 使用sed命令替換settings.xml中的密碼占位符 sed -i s/{{NEXUS_PASSWORD}}/$NEXUS_PASSWORD/g ci-settings.xml mvn -s ci-settings.xml clean deploy清理本地倉(cāng)庫(kù)緩存CI服務(wù)器的本地倉(cāng)庫(kù)可能因?yàn)槎啻螛?gòu)建而變得龐大或殘留錯(cuò)誤版本的構(gòu)件。定期清理mvn dependency:purge-local-repository或?yàn)槊看螛?gòu)建使用一個(gè)干凈的臨時(shí)目錄作為本地倉(cāng)庫(kù)可以保證構(gòu)建環(huán)境的一致性。7.3 常見(jiàn)問(wèn)題排查清單當(dāng)你遇到Maven構(gòu)建問(wèn)題時(shí)可以按這個(gè)清單自查依賴下載失敗/超時(shí)檢查網(wǎng)絡(luò)連接。檢查mirrors配置確認(rèn)鏡像地址正確且可用。嘗試在瀏覽器中直接訪問(wèn)鏡像URL看是否能打開(kāi)。檢查proxies配置如果不需要代理請(qǐng)注釋掉或設(shè)為activefalse/active。構(gòu)建失敗提示認(rèn)證失敗檢查servers中的id是否與倉(cāng)庫(kù)/鏡像的id完全一致大小寫(xiě)敏感。檢查用戶名密碼是否正確。如果是加密密碼確認(rèn)加密過(guò)程無(wú)誤。嘗試使用mvn help:effective-settings命令查看最終生效的配置確認(rèn)認(rèn)證信息已加載。構(gòu)建成功但運(yùn)行時(shí)找不到類運(yùn)行mvn dependency:tree檢查是否有依賴沖突某個(gè)需要的版本被其他依賴的版本覆蓋了。檢查scope是否正確test范圍的依賴不會(huì)打包到運(yùn)行時(shí)的jar/war中。構(gòu)建速度異常慢檢查是否在下載-SNAPSHOT版本Maven默認(rèn)每天檢查一次更新可以將其策略改為always或interval:60針對(duì)快照倉(cāng)庫(kù)或改為never針對(duì)穩(wěn)定倉(cāng)庫(kù)。檢查本地倉(cāng)庫(kù)磁盤空間是否不足。嘗試增加Maven的JVM內(nèi)存MAVEN_OPTS。對(duì)于多模塊項(xiàng)目嘗試使用并行構(gòu)建-T參數(shù)。配置Maven不是一個(gè)一勞永逸的事情但隨著項(xiàng)目和環(huán)境越來(lái)越復(fù)雜一份精心維護(hù)的settings.xml就是你構(gòu)建過(guò)程中的“定海神針”。它能把那些瑣碎的網(wǎng)絡(luò)問(wèn)題、環(huán)境差異、依賴沖突隔離在構(gòu)建基礎(chǔ)設(shè)施層讓你和你的團(tuán)隊(duì)能更專注于代碼本身。花點(diǎn)時(shí)間理解并配好它絕對(duì)是一筆高回報(bào)的投資。