Terry.Li-彬

          虛其心,可解天下之問(wèn);專(zhuān)其心,可治天下之學(xué);靜其心,可悟天下之理;恒其心,可成天下之業(yè)。

            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            143 隨筆 :: 344 文章 :: 130 評(píng)論 :: 0 Trackbacks
          具體怎樣使用deploy命令部署構(gòu)件到nexus服務(wù)器上可以參考經(jīng)典的《Maven Definitive Guide》(Maven操作指南),書(shū)中的16.7節(jié)里面講解的非常詳細(xì)。假設(shè)我們?cè)陧?xiàng)目pom.xml文件中對(duì)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>

          這里我要說(shuō)的是在使用的過(guò)程中遇到的幾個(gè)都是“Failed to transfer file”錯(cuò)誤,錯(cuò)誤信息如下格式:

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

          也就是說(shuō)前面錯(cuò)誤的信息都是一樣的,只是后面返回的HTTP狀態(tài)數(shù)字不同。

          1. Return code is: 405
          這個(gè)問(wèn)題害我查了兩個(gè)多小時(shí)才發(fā)現(xiàn)錯(cuò)誤的根源,簡(jiǎn)單的錯(cuò)誤就是在Maven執(zhí)行到上傳文件到服務(wù)器的時(shí)候出現(xiàn)一個(gè)HTTP 405錯(cuò)誤。開(kāi)始的時(shí)候總以為是Maven本身的問(wèn)題,所以在這個(gè)上面浪費(fèi)了不少時(shí)間。后來(lái)仔細(xì)查了405錯(cuò)誤的含義是“用來(lái)訪問(wèn)本頁(yè)面的 HTTP 方法不被允許”,最后終于發(fā)現(xiàn)是因?yàn)榍懊鎟epository的地址寫(xiě)錯(cuò)了,或者是端口寫(xiě)錯(cuò),或者是地址中的某個(gè)單詞拼錯(cuò)了,反正原因就是 repository的地址寫(xiě)錯(cuò)了。

          2. Return code is: 401或者Return code is: 403
          其實(shí)403錯(cuò)誤就是“禁止訪問(wèn)”的含義,所以問(wèn)題的根源肯定在授權(quán)上面。Maven在默認(rèn)情況下會(huì)使用deployment帳號(hào)(默認(rèn)密碼deploy) 登錄的系統(tǒng),但是關(guān)鍵的Nexus中Releases倉(cāng)庫(kù)默認(rèn)的Deployment Policy是“Disable Redeploy”,所以無(wú)法部署的問(wèn)題在這個(gè)地方,方法是將其修改為“Allow Redeploy”就可以了。


          到這里還沒(méi)有結(jié)束,因?yàn)槿绻苯影凑丈厦娴脑O(shè)置的話(huà)會(huì)有一個(gè)安全問(wèn)題,那就是這樣所有的開(kāi)發(fā)人員都可以將構(gòu)件部署到Nexus的releases倉(cāng)庫(kù)中 了,時(shí)間長(zhǎng)了會(huì)導(dǎo)致這個(gè)倉(cāng)庫(kù)中非常亂,這也應(yīng)該是nexus為什么默認(rèn)情況下將Release倉(cāng)庫(kù)的發(fā)布權(quán)限關(guān)閉的原因了。解決這個(gè)問(wèn)題的整體思路就是在 部署構(gòu)件的時(shí)候需要使用用戶(hù)名和密碼登錄,操作如下:
          (1) 首先將Releases倉(cāng)庫(kù)默認(rèn)的Deployment Policy修改為“Allow Redeploy”;
          (2) 然后在右邊的Security下面的Users中,修改deployment帳號(hào)的密碼,方法是在帳號(hào)上右鍵,然后選擇“Set Password”(PS:這個(gè)操作我找了好久,后來(lái)無(wú)意中右鍵才找到,呵呵~~);

          (3) 這個(gè)時(shí)候如果直接執(zhí)行 mvn deploy 命令的話(huà)就又會(huì)出現(xiàn)401錯(cuò)誤,還有一步就是將密碼設(shè)置到Maven settings.xml中。打開(kāi)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>

          這里需要特別說(shuō)明一句的是里面的id必須和你在項(xiàng)目pom.xml文件中distributionManagement下面設(shè)置的倉(cāng)庫(kù)id一致!當(dāng)然了,這個(gè)里面你也可以設(shè)置admin帳號(hào),或者參照deployment的權(quán)限手動(dòng)添加新的帳號(hào)等等都是可以的。

          當(dāng)然,問(wèn)題到這里已經(jīng)得到了比較完美的解放,但是
          如果有人還要較真的話(huà)會(huì)想到帳號(hào)的密碼直接放到配置文件里面不是很安全。其實(shí)只要這里不建議放admin帳號(hào),而deployment是無(wú)法登錄的。如果非要更安全一些的話(huà),也可以使用Maven 2.1.0之后所提供的密碼加密功能,操作的步驟如下:
          (1) 使用“mvn –encrypt-master-password xxx”或“mvn –emp xxx”創(chuàng)建一個(gè)主密鑰,后面的xxx就是你所要設(shè)置的密鑰的內(nèi)容,這個(gè)密鑰主要用于后面加密密碼來(lái)用的;命令執(zhí)行之后會(huì)產(chǎn)生一個(gè)類(lèi)似 {jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}形式的字符串。
          (2) 在${user.home}/.m/目錄下創(chuàng)建一個(gè)名為settings-security.xml文件,我們將剛剛產(chǎn)生的主密鑰放到這個(gè)文件中,文件的內(nèi)容如下:
          <?xml version="1.0" encoding="UTF-8"?>
          <settingsSecurity>
          <master>{jSMOWnoPFgsHVpMvz5VrIt5kRbzGpI8u+9EF1iFQyJQ=}</master>
          </settingsSecurity>

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

          3. Return code is: 400
          400錯(cuò)誤的含義是“錯(cuò)誤的請(qǐng)求”,在這里的原因是往往是沒(méi)有部署到nexus的倉(cāng)庫(kù)中。nexus的repository分三種類(lèi)型:Hosted、 Proxy和Virtual,另外還有一個(gè)repository group(倉(cāng)庫(kù)組)用于對(duì)多個(gè)倉(cāng)庫(kù)進(jìn)行組合。部署的時(shí)候只能部署到Hosted類(lèi)型的倉(cāng)庫(kù)中,如果是其他類(lèi)型就會(huì)出現(xiàn)這個(gè)400錯(cuò)誤。

          還有一種情況也會(huì)出現(xiàn)400錯(cuò)誤,就是默認(rèn)情況下部署構(gòu)件到Releases倉(cāng)庫(kù)中有時(shí)也會(huì)出現(xiàn)400錯(cuò)誤,這個(gè)原因就像上面提到的那樣,Nexus中 Releases倉(cāng)庫(kù)默認(rèn)的Deployment Policy是“Disable Redeploy”,所以無(wú)論你在settings.xml文件中將server的username設(shè)置為deployment還是使用admin都是無(wú) 法部署的,就會(huì)出現(xiàn)這個(gè)400錯(cuò)誤。這個(gè)問(wèn)題也困擾了我好長(zhǎng)時(shí)間,而且我還看到網(wǎng)上有人說(shuō)admin沒(méi)有部署構(gòu)件的權(quán)限,這個(gè)是不對(duì)的。修改的方法可以參 考上面第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>

          posted on 2010-09-26 00:06 禮物 閱讀(35967) 評(píng)論(2)  編輯  收藏 所屬分類(lèi): Maven2

          評(píng)論

          # re: Maven使用deploy命令部署構(gòu)建[未登錄](méi) 2014-09-29 09:42 Anderson
          好,寫(xiě)的比較詳細(xì),按此配置成功。  回復(fù)  更多評(píng)論
            

          # re: Maven使用deploy命令部署構(gòu)建 2015-12-01 16:08 曲奇餅
          感謝!我也碰到這個(gè)問(wèn)題了!  回復(fù)  更多評(píng)論
            

          主站蜘蛛池模板: 砚山县| 开远市| 阜南县| 依兰县| 铁岭县| 伊宁市| 利辛县| 陇西县| 清涧县| 星子县| 晋中市| 沙田区| 蕲春县| 吐鲁番市| 承德市| 根河市| 高唐县| 聂拉木县| 乐东| 兴隆县| 嘉峪关市| 安康市| 桃园市| 阿瓦提县| 贵定县| 海丰县| 琼结县| 班戈县| 自治县| 岳西县| 夏邑县| 项城市| 巩留县| 兰溪市| 融水| 开原市| 广丰县| 海南省| 新巴尔虎右旗| 车险| 西峡县|