Maven2部署构件到Nexus时出现的Failed to transfer file错误

原文出处:  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服务器的设置信息以下: html

  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”错误,错误信息以下格式: 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

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

里须要特别说明一句的是里面的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文件,咱们将刚刚产生的主密钥放到这个文件中,文件的内容以下: 加密

  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盘里面,具体的操做能够看下面的参考资料。 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

相关文章
相关标签/搜索