具體怎樣使用deploy命令部署構(gòu)件到nexus服務(wù)器上可以參考經(jīng)典的《Maven Definitive Guide》(Maven操作指南),書中的16.7節(jié)里面講解的非常詳細(xì)。假設(shè)我們在項目pom.xml文件中對maven服務(wù)器的設(shè)置信息如下:
<distributionManagement>
<repository>
<id>nexus-releases</id>
<name>Local Nexus Repository</name>
<url>http://192.168.1.99:8081/content/repositories/releases</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Local Nexus Repository</name>
<url>http://192.168.1.99:8081/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
這里我要說的是在使用的過程中遇到的幾個都是“Failed to transfer file”錯誤,錯誤信息如下格式:
Error deploying artifact: Failed to transfer file:… Return code is:4xx
也就是說前面錯誤的信息都是一樣的,只是后面返回的HTTP狀態(tài)數(shù)字不同。
1. Return code is: 405
這個問題害我查了兩個多小時才發(fā)現(xiàn)錯誤的根源,簡單的錯誤就是在Maven執(zhí)行到上傳文件到服務(wù)器的時候出現(xiàn)一個HTTP
405錯誤。開始的時候總以為是Maven本身的問題,所以在這個上面浪費(fèi)了不少時間。后來仔細(xì)查了405錯誤的含義是“用來訪問本頁面的 HTTP
方法不被允許”,最后終于發(fā)現(xiàn)是因?yàn)榍懊鎟epository的地址寫錯了,或者是端口寫錯,或者是地址中的某個單詞拼錯了,反正原因就是
repository的地址寫錯了。
2. Return code is: 401或者Return code is: 403
其實(shí)403錯誤就是“禁止訪問”的含義,所以問題的根源肯定在授權(quán)上面。Maven在默認(rèn)情況下會使用deployment帳號(默認(rèn)密碼deploy)
登錄的系統(tǒng),但是關(guān)鍵的Nexus中Releases倉庫默認(rèn)的Deployment Policy是“Disable
Redeploy”,所以無法部署的問題在這個地方,方法是將其修改為“Allow Redeploy”就可以了。
到這里還沒有結(jié)束,因?yàn)槿绻苯影凑丈厦娴脑O(shè)置的話會有一個安全問題,那就是這樣所有的開發(fā)人員都可以將構(gòu)件部署到Nexus的releases倉庫中
了,時間長了會導(dǎo)致這個倉庫中非常亂,這也應(yīng)該是nexus為什么默認(rèn)情況下將Release倉庫的發(fā)布權(quán)限關(guān)閉的原因了。解決這個問題的整體思路就是在
部署構(gòu)件的時候需要使用用戶名和密碼登錄,操作如下:
(1) 首先將Releases倉庫默認(rèn)的Deployment Policy修改為“Allow Redeploy”;
(2) 然后在右邊的Security下面的Users中,修改deployment帳號的密碼,方法是在帳號上右鍵,然后選擇“Set Password”(PS:這個操作我找了好久,后來無意中右鍵才找到,呵呵~~);
(3) 這個時候如果直接執(zhí)行 mvn deploy 命令的話就又會出現(xiàn)401錯誤,還有一步就是將密碼設(shè)置到Maven
settings.xml中。打開settings.xml文件(${user.home}/.m/settings.xml或%{m2_home}
/conf/settings.xml),找到<servers>,然后修改信息如下:
<server>
<id>nexus-releases</id>
<username>deployment</username>
<password>deploydv89</password>
</server>
<server>
<id>nexus-snapshots</id>
<username>deployment</username>
<password>deploydv89</password>
</server>
這里需要特別說明一句的是里面的id必須和你在項目pom.xml文件中distributionManagement下面設(shè)置的倉庫id一致!當(dāng)然了,這個里面你也可以設(shè)置admin帳號,或者參照deployment的權(quán)限手動添加新的帳號等等都是可以的。
當(dāng)然,問題到這里已經(jīng)得到了比較完美的解放,但是
如果有人還要較真的話會想到帳號的密碼直接放到配置文件里面不是很安全。其實(shí)只要這里不建議放admin帳號,而deployment是無法登錄的。如果非要更安全一些的話,也可以使用Maven 2.1.0之后所提供的密碼加密功能,操作的步驟如下:
(1) 使用“mvn
–encrypt-master-password xxx”或“mvn –emp
xxx”創(chuàng)建一個主密鑰,后面的xxx就是你所要設(shè)置的密鑰的內(nèi)容,這個密鑰主要用于后面加密密碼來用的;命令執(zhí)行之后會產(chǎn)生一個類似
{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}形式的字符串。
(2) 在${user.home}/.m/目錄下創(chuàng)建一個名為settings-security.xml文件,我們將剛剛產(chǎn)生的主密鑰放到這個文件中,文件的內(nèi)容如下:
<?xml version="1.0" encoding="UTF-8"?>
<settingsSecurity>
<master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
</settingsSecurity>
注意,這個settings-security.xml文件一定要放在${user.home}/.m/目錄下面,而不能放在${m2_home}/conf目錄下!
(3) 使用“mvn –encrypt-password
xxx”或“mvn –ep
xxx”命令對帳號的密碼進(jìn)行加密,后面的xxx就是帳號的密碼,加密之后依然會產(chǎn)生一個“{xxx}”形式的字符串,將這個字符串替換上面
settings.xml文件中的server下面的password節(jié)點(diǎn)內(nèi)容即可。
還有一種更安全的方式,就是將主密鑰放到U盤里面,具體的操作可以看下面的參考資料。
3. Return code is: 400
400錯誤的含義是“錯誤的請求”,在這里的原因是往往是沒有部署到nexus的倉庫中。nexus的repository分三種類型:Hosted、
Proxy和Virtual,另外還有一個repository
group(倉庫組)用于對多個倉庫進(jìn)行組合。部署的時候只能部署到Hosted類型的倉庫中,如果是其他類型就會出現(xiàn)這個400錯誤。
還有一種情況也會出現(xiàn)400錯誤,就是默認(rèn)情況下部署構(gòu)件到Releases倉庫中有時也會出現(xiàn)400錯誤,這個原因就像上面提到的那樣,Nexus中
Releases倉庫默認(rèn)的Deployment Policy是“Disable
Redeploy”,所以無論你在settings.xml文件中將server的username設(shè)置為deployment還是使用admin都是無
法部署的,就會出現(xiàn)這個400錯誤。這個問題也困擾了我好長時間,而且我還看到網(wǎng)上有人說admin沒有部署構(gòu)件的權(quán)限,這個是不對的。修改的方法可以參
考上面第2條的做法。
mvn deploy -Dmaven.test.skip=true
<?xml?version="1.0"?encoding="UTF-8"?>
<settings?xmlns="http://maven.apache.org/SETTINGS/1.0.0"
????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
????xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0?http://maven.apache.org/xsd/settings-1.0.0.xsd">
????<localRepository>F:\m2Repository</localRepository>
????
????<pluginGroups>
????</pluginGroups>
????<proxies>
????</proxies>
????
????<servers>
????????<server>
????????????<id>nexus-releases</id>
????????????<username>admin</username>
????????????<password>admin123</password>
????????</server>
????????<server>
????????????<id>nexus-snapshots</id>
????????????<username>admin</username>
????????????<password>admin123</password>
????????</server>
????</servers>
????
????<mirrors>
????????<mirror>
????????????<id>nexus</id>
????????????<mirrorOf>*</mirrorOf>
????????????<name>Nexus?lirenkj</name>
????????????<url>http://nexus.lirenkj.com/content/groups/public/</url>
????????</mirror>
????</mirrors>
????<profiles>
????????<profile>
????????????<id>dev</id>
????????????<activation>
????????????????<jdk>1.7</jdk>
????????????</activation>
????????????<repositories>
????????????????<repository>
????????????????????<id>nexus</id>
????????????????????<name>local?private?nexus</name>
????????????????????<url>http://nexus.lirenkj.com/content/groups/public/</url>
????????????????????<releases>
????????????????????????<enabled>true</enabled>
????????????????????</releases>
????????????????????<snapshots>
????????????????????????<enabled>true</enabled>
????????????????????</snapshots>
????????????????</repository>
????????????</repositories>
????????????<pluginRepositories>
????????????????<pluginRepository>
????????????????????<id>nexus</id>
????????????????????<name>local?private?nexus</name>
????????????????????<url>http://nexus.lirenkj.com/content/groups/public/</url>
????????????????????<releases>
????????????????????????<enabled>true</enabled>
????????????????????</releases>
????????????????????<snapshots>
????????????????????????<enabled>true</enabled>
????????????????????</snapshots>
????????????????</pluginRepository>
????????????</pluginRepositories>
????????</profile>
????</profiles>
????<activeProfiles>
????????<activeProfile>dev</activeProfile>
????</activeProfiles>
</settings>