Error deploying artifact: Failed to transfer file:XXXXX Return co de is: 401

原文出處: http://www.javatang.com/archives/2010/01/23/4518375.html ---有些小改動
作者: Jet Mah from Java堂
聲明: 可以非商業性任意轉載, 轉載時請務必以超鏈接形式標明文章原始出處、作者信息及此聲明!

體怎樣使用deploy命令部署構件到nexus服務器上可以參考經典的《Maven Definitive Guide》(Maven操作指南),書中的16.7節裏面講解的非常詳細。假設我們在項目pom.xml文件中對maven服務器的設置信息如下:

  1. <distributionManagement>
  2.       <repository>
  3.           <id>nexus-releases</id>
  4.           <name>Local Nexus Repository</name>
  5.           <url>http://192.168.1.99:8081/content/repositories/releases</url>
  6.       </repository>
  7.       <snapshotRepository>
  8.           <id>nexus-snapshots</id>
  9.           <name>Local Nexus Repository</name>
  10.           <url>http://192.168.1.99:8081/content/repositories/snapshots</url>
  11.       </snapshotRepository>
  12.   </distributionManagement>

裏我要說的是在使用的過程中遇到的幾個都是“Failed to transfer file”錯誤,錯誤信息如下格式:

rror deploying artifact: Failed to transfer file:… Return code is:4xx

就是說前面錯誤的信息都是一樣的,只是後面返回的HTTP狀態數字不同。

Return code is: 405
這個問題害我查了兩個多小時才發現錯誤的根源,簡單的錯誤就是在Maven執行到上傳文件到服務器的時候出現一個HTTP 405錯誤。開始的時候總以爲是Maven本身的問題,所以在這個上面浪費了不少時間。後來仔細查了405錯誤的含義是“用來訪問本頁面的 HTTP 方法不被允許”,最後終於發現是因爲前面repository的地址寫錯了,或者是端口寫錯,或者是地址中的某個單詞拼錯了,反正原因就是repository的地址寫錯了

Return code is: 401或者Return code is: 403
其實403錯誤就是“禁止訪問”的含義,所以問題的根源肯定在授權上面。Maven在默認情況下會使用deployment帳號(默認密碼deploy)登錄的系統,但是關鍵的Nexus中Releases倉庫默認的Deployment Policy是“Disable Redeploy”,所以無法部署的問題在這個地方,方法是將其修改爲“Allow Redeploy”就可以了。

這裏還沒有結束,因爲如果直接按照上面的設置的話會有一個安全問題,那就是這樣所有的開發人員都可以將構件部署到Nexus的releases倉庫中了,時間長了會導致這個倉庫中非常亂,這也應該是nexus爲什麼默認情況下將Release倉庫的發佈權限關閉的原因了。解決這個問題的整體思路就是在部署構件的時候需要使用用戶名和密碼登錄,操作如下:
(1) 首先將Releases倉庫默認的Deployment Policy修改爲“Allow Redeploy”;
(2) 然後在右邊的Security下面的Users中,修改deployment帳號的密碼,方法是在帳號上右鍵,然後選擇“Set Password”(PS:這個操作我找了好久,後來無意中右鍵才找到,呵呵~~);

(3) 這個時候如果直接執行 mvn deploy 命令的話就又會出現401錯誤,還有一步就是將密碼設置到Maven settings.xml中。打開settings.xml文件(${user.home}/.m/settings.xml或%{m2_home}/conf/settings.xml),找到<servers>,然後修改信息如下:

  1. <server>
  2.       <id>releases</id>
  3.       <username>deployment</username>
  4.       <password>deploydv89</password>
  5.     </server>
  6.  
  7.     <server>
  8.       <id>snapshots</id>
  9.       <username>deployment</username>
  10.       <password>deploydv89</password>
  11.    </server>

裏需要特別說明一句的是裏面的id必須和你在項目pom.xml文件中distributionManagement下面設置的倉庫id一致!當然了,這個裏面你也可以設置admin帳號,或者參照deployment的權限手動添加新的帳號等等都是可以的。

然,問題到這裏已經得到了比較完美的解放,但是如果有人還要較真的話會想到帳號的密碼直接放到配置文件裏面不是很安全。其實只要這裏不建議放admin帳號,而deployment是無法登錄的。如果非要更安全一些的話,也可以使用Maven 2.1.0之後所提供的密碼加密功能,操作的步驟如下:
(1) 使用“mvn –encrypt-master-password xxx”或“mvn –emp xxx”創建一個主密鑰,後面的xxx就是你所要設置的密鑰的內容,這個密鑰主要用於後面加密密碼來用的;命令執行之後會產生一個類似{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}形式的字符串。
(2) 在${user.home}/.m/目錄下創建一個名爲settings-security.xml文件,我們將剛剛產生的主密鑰放到這個文件中,文件的內容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <settingsSecurity>
  3.     <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
  4. </settingsSecurity>

意,這個settings-security.xml文件一定要放在${user.home}/.m/目錄下面,而不能放在${m2_home}/conf目錄下!
(3) 使用“mvn –encrypt-password xxx”或“mvn –ep xxx”命令對帳號的密碼進行加密,後面的xxx就是帳號的密碼,加密之後依然會產生一個“{xxx}”形式的字符串,將這個字符串替換上面settings.xml文件中的server下面的password節點內容即可。
還有一種更安全的方式,就是將主密鑰放到U盤裏面,具體的操作可以看下面的參考資料。

Return code is: 400
400錯誤的含義是“錯誤的請求”,在這裏的原因是往往是沒有部署到nexus的倉庫中。nexus的repository分三種類型:Hosted、Proxy和Virtual,另外還有一個repository group(倉庫組)用於對多個倉庫進行組合。部署的時候只能部署到Hosted類型的倉庫中,如果是其他類型就會出現這個400錯誤。

有一種情況也會出現400錯誤,就是默認情況下部署構件到Releases倉庫中有時也會出現400錯誤,這個原因就像上面提到的那樣,Nexus中Releases倉庫默認的Deployment Policy是“Disable Redeploy”,所以無論你在settings.xml文件中將server的username設置爲deployment還是使用admin都是無法部署的,就會出現這個400錯誤。這個問題也困擾了我好長時間,而且我還看到網上有人說admin沒有部署構件的權限,這個是不對的。修改的方法可以參考上面第2條的做法。

發佈了49 篇原創文章 · 獲贊 0 · 訪問量 5633
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章