執行 mvn clean package deploy 時,構建在 maven-deploy-plugin 階段失敗,日誌顯示:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy ...
[ERROR] Could not transfer artifact ... Error code 400, Bad Request
HTTP 400 代表「請求語法錯誤或參數不合法」,Nexus 拒絕接收構件。本文系統梳理常見原因與解決步驟。
| 檢查項目 | 說明 | 驗證方式 |
|---|---|---|
| Repository URL 結尾斜線 | Nexus 要求 repository URL 必須以 / 結尾 | POM <url> 及 settings.xml <id> 對應 URL 皆需以 / 結尾 |
| Repository 類型與版本策略匹配 | SNAPSHOT 版本只能部署到 Snapshot 庫;Release 版本只能部署到 Release 庫 | POM <version>0.0.5-SNAPSHOT</version> → 必須對應 Snapshot 庫 |
| Nexus 憑證權限 | settings.xml 中 <server><id> 需與 POM <distributionManagement><repository><id> 完全一致 |
日誌顯示 from/to local-nexus → settings.xml 需有 <id>local-nexus</id> |
| Nexus 庫配置:允許重新部署 | Snapshot 庫需開啟 Allow Redeploy;Release 庫通常禁止覆蓋 |
Nexus UI → Repositories → 配置該庫 → Deployment Policy |
| 構件坐標合法性 | groupId、artifactId、version 不得包含非法字元(空格、中文、特殊符號) |
檢查 POM 坐標命名規範 |
| 網路/代理/防火牆 | 企業環境常因代理截斷請求體、或防火牆攔截大檔案上傳 | 嘗試 curl -v -u user:pass -T file.jar URL 直接上傳測試 |
日誌顯示:from/to local-nexus (https://XXXX/nexus/content/repositories/cxb/)
<repository><id>local-nexus</id><url>https://.../cxb/</url></repository>settings.xml 應有:<server><id>local-nexus</id><username>...</username><password>...</password></server>注意:您貼出的 settings.xml 片段中同時出現 public-nexus 和 local-nexus,請確認 POM 使用的是哪一個 ID,並確保該 ID 在 settings 中只出現一次且密碼正確。
<url>https://XXX/nexus/content/repositories/cxb/</url>
<url>https://XXX/nexus/content/repositories/cxb</url>
專案版本為 0.0.5-SNAPSHOT,目標 Nexus 庫 必須是 Snapshot (宿主) 庫,且 Deployment Policy 設為 Allow Redeploy。若誤指向 Release 庫,Nexus 會拋 400。
嘗試刪除本地倉庫對應構件目錄:
rm -rf ~/.m2/repository/com/cmcc/dsp/open/client/DEMO/0.0.5-SNAPSHOT/
再重新 mvn clean deploy。
mvn clean deploy -X 2>&1 | tee deploy.log
搜尋 > PUT、< HTTP/1.1 400、Request Body,可見實際發送的 URL、Header、Body,對比 Nexus 存取日誌($NEXUS_HOME/sonatype-work/nexus/logs/request.log)。
繞過 Maven 直接測試上傳,隔離是 Maven 配置問題還是 Nexus/網路問題:
curl -v -u "username:password" \
-T "target/DEMO-0.0.5-20160318.111746-1.jar" \
"https://XXX/nexus/content/repositories/cxb/com/cmcc/dsp/open/client/DEMO/0.0.5-SNAPSHOT/DEMO-0.0.5-20160318.111746-1.jar"
Maven Deploy 400 Bad Request 90% 以上源於 ID 不匹配、URL 缺斜線、Snapshot/Release 庫類型錯配、或 Nexus 不允許重新部署。按清單逐項核對,配合 curl 隔離測試,可快速定位根因。