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

0人阅读 评论(0) 收藏 举报
分类:

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

具体怎样使用deploy命令部署构件到nexus服务器上可以参考经典的《Maven Definitive Guide》(Maven操作指南),书中的16.7节里面讲解的非常详细。假设我们在项目pom.xml文件中对maven服务器的设置信息如下:

复制代码
<distributionManagement>
    <repository>
        <id>releases</id>
        <name>Local Nexus Repository</name>
        <url>http://localhost:8081/nexus/content/repositories/releases</url>
    </repository>
    <snapshotRepository>
        <id>snapshots</id>
        <name>Local Nexus Repository</name>
        <url>http://localhost:8081/nexus/content/repositories/snapshots</url>
    </snapshotRepository>
</distributionManagement>
复制代码

这里我要说的是在使用的过程中遇到的几个都是“Failed to transfer file”错误,错误信息如下格式:

Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy (default-deploy) on project sshe: Failed to deploy artifacts: Could not transfer artifact com.chowmin:sshe:war:v20140504 from/to releases (http://localhost:8081/nexus/content/repositories/releases): Failed to transfer file: http://localhost:8081/nexus/content/repositories/releases/com/chowmin/sshe/v20140504/sshe-v20140504.war. Return code is: 400, ReasonPhrase: Bad Request. -> [Help 1]

也就是说前面错误的信息都是一样的,只是后面返回的HTTP状态数字不同。

1. Return code is: 405
这个问题害我查了两个多小时才发现错误的根源,简单的错误就是在Maven执行到上传文件到服务器的时候出现一个HTTP 405错误。开始的时候总以为是Maven本身的问题,所以在这个上面浪费了不少时间。后来仔细查了405错误的含义是“用来访问本页面的 HTTP 方法不被允许”,最后终于发现是因为前面repository的地址写错了,或者是端口写错,或者是地址中的某个单词拼错了,反正原因就是repository的地址写错了

2. 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”;
(3) 这个时候如果直接执行 mvn deploy 命令的话就又会出现401错误,还有一步就是将密码设置到Maven 
settings.xml中。打开settings.xml文件(${user.home}/.m/settings.xml或%{m2_home}
/conf/settings.xml),找到<servers>,然后修改信息如下:

复制代码
<server>
    <id>releases</id>
    <username>admin</username>
    <password>admin123</password>
</server>
<server>
    <id>snapshots</id>
    <username>admin</username>
    <password>admin123</password>
</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文件,我们将刚刚产生的主密钥放到这个文件中,文件的内容如下:

 

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

注意,这个settings-security.xml文件一定要放在user.home/.m/user.home/.m/目录下面,而不能放在{m2_home}/conf目录下!
(3) 使用“mvn --encrypt-password xxx”或“mvn --ep xxx”命令对帐号的密码进行加密,后面的xxx就是帐号的密码,加密之后依然会产生一个“{xxx}”形式的字符串,将这个字符串替换上面 settings.xml文件中的server下面的password节点内容即可。
还有一种更安全的方式,就是将主密钥放到U盘里面,具体的操作可以看下面的参考资料。

3. 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 问题解决(Failed to look for file: http://)

1、问题描述: Failed to execute goal on project 某项目名称:  Could not resolve dependencies for project  某项目...
  • mantou0611
  • mantou0611
  • 2014-04-03 14:41:45
  • 797

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

我们在项目pom.xml文件中对maven服务器的设置信息如下:  distributionManagement>       repository>           id>nexu...
  • kobejayandy
  • kobejayandy
  • 2015-04-04 18:33:07
  • 2155

将本地构件部署至nexus

本文介绍如何将本地项目打包发布到nexus服务器上,以及如何将第三方jar包发布到nexus服务器上。个人珍藏资料!!!...
  • jaune161
  • jaune161
  • 2015-03-11 14:17:42
  • 1713

配置Nexus仓库,部署构件到Nexus仓库

上一节,我们讲述了如何配置安装nexus系统,这节,我们来介绍nexus的使用 1.登录 在红色的部分点击登陆,输入用户名和密码 admin/admin123。 这里可以配置nexus系统,...
  • chendaoqiu
  • chendaoqiu
  • 2015-06-11 16:37:37
  • 2553

Maven 部署构件至Nexus

陈科肇 =========== 1.描述 在一个开发团队组中,有需要将开发的快照版本和构件布置至一个内部仓库。使用Nexus,即很容易部署至Nexus宿主仓库(内部仓库)。 2.部署发布版 要部署发布...
  • u013474104
  • u013474104
  • 2015-02-05 21:58:22
  • 741

nexus发布工程版本问题总结

在发布工程开发版本,部署版本时,遇见两个问题,一个是配置setting.xml和工程pom.xml文件的server的ID名称一致性问题,第二个是发布部署版本时,nexus不允许同一版本重复部署,这个...
  • dymkkj
  • dymkkj
  • 2016-12-08 16:16:46
  • 726

Maven2部署构件到Nexus时出现的错误处理

具体怎样使用deploy命令部署构件到nexus服务器上可以参考经典的《Maven Definitive Guide》(Maven操作指南),书中的16.7节里面讲解的非常详细。假设我们在项目pom....
  • stevenmsg
  • stevenmsg
  • 2012-08-12 12:35:09
  • 249

eclipse导入Maven工程Failure to transfer org.apache.maven:maven-archiver:pom:2.4.1 from http://repo.mave

在创建或则导入maven项目的时候出现如下问题: Failure to transfer org.apache.maven:maven-archiver:pom:2.4.1 from http:...
  • swimming_in_IT_
  • swimming_in_IT_
  • 2017-08-12 21:59:34
  • 2370

解决nexus下载maven索引的问题

用nexus搭建了maven repository的镜像服务器。当时都安装好之后,将本地的settings.xml修改成使用该镜像服务器。这些配置都搞定后,测试时执行任何mvn任务时都存在问题。在管理...
  • davil_dev
  • davil_dev
  • 2011-11-02 19:39:26
  • 18792

使用sshd 连接,sftp上传文件出现 failed to open a secure file transfer session错误提示

系统:Centos 5.21、使用sshd 连接,sftp上传文件出现 failed to open a secure file transfer session错误提示 vi /etc/ssh/ss...
  • zhangtuo
  • zhangtuo
  • 2010-02-21 11:41:00
  • 4029
    个人资料
    等级:
    访问量: 2755
    积分: 152
    排名: 110万+