體怎樣使用deploy命令部署構件到nexus服務器上能夠參考經典的《Maven Definitive Guide》(Maven操做指南),書中的16.7節裏面講解的很是詳細。假設咱們在項目pom.xml文件中對maven服務器的設置信息以下: html
裏我要說的是在使用的過程當中遇到的幾個都是「Failed to transfer file」錯誤,錯誤信息以下格式: java
rror deploying artifact: Failed to transfer file:… Return code is:4xx apache
就是說前面錯誤的信息都是同樣的,只是後面返回的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」就能夠了。
maven
這裏尚未結束,由於若是直接按照上面的設置的話會有一個安全問題,那就是這樣全部的開發人員均可以將構件部署到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>,而後修改信息以下: ide
裏須要特別說明一句的是裏面的id必須和你在項目pom.xml文件中distributionManagement下面設置的倉庫id一致!固然了,這個裏面你也能夠設置admin賬號,或者參照deployment的權限手動添加新的賬號等等都是能夠的。 ui
然,問題到這裏已經獲得了比較完美的解放,可是若是有人還要較真的話會想到賬號的密碼直接放到配置文件裏面不是很安全。其實只要這裏不建議放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文件,咱們將剛剛產生的主密鑰放到這個文件中,文件的內容以下: 加密
意,這個settings-security.xml文件必定要放在${user.home}/.m/目錄下面,而不能放在${m2_home}/conf目錄下!
(3) 使用「mvn –encrypt-password xxx」或「mvn –ep xxx」命令對賬號的密碼進行加密,後面的xxx就是賬號的密碼,加密以後依然會產生一個「{xxx}」形式的字符串,將這個字符串替換上面settings.xml文件中的server下面的password節點內容便可。
還有一種更安全的方式,就是將主密鑰放到U盤裏面,具體的操做能夠看下面的參考資料。 url
. 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條的作法。
考資料:
maven 中 部署構件至Nexus(mvn deploy)
Maven2中須要注意的問題
maven deploy到nexus私服出錯問題
Maven Tips and Tricks: Encrypting Passwords
Maven – Password Encryption