参阅:http://www.javatang.com/archives/2010/01/23/4518375.html

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

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

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

也就是说前面错误的信息都是一样的,只是后面返回的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”(PS:这个操作我找了好久,后来无意中右键才找到,呵呵~~);

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

  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的权限手动添加新的帐号等等都是可以的。

当然,问题到这里已经得到了比较完美的解放,但是如果有人还要较真的话会想到帐号的密码直接放到配置文件里面不是很安全。其实只要这里不建议放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盘里面,具体的操作可以看下面的参考资料。

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 中 部署构件至Nexus(mvn deploy)
Maven2中需要注意的问题
maven deploy到nexus私服出错问题
Maven Tips and Tricks: Encrypting Passwords
Maven - Password Encryption

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

  1. mysql执行脚本文件时总是显示failed to open file

    mysql执行脚本文件时总是显示failed to open file 这个问题把我折磨得心力交瘁,我试过了包括到不限于以下的语句: source D:/mysql8/test.sql source ...

  2. maven 中 部署构件至Nexus(mvn deploy)

    http://jacky2007.iteye.com/blog/354387 nexus中的设置就不说了 首先要在pom.xml中添加 Java代码   <distributionManagem ...

  3. maven (http://repo1.maven.org/maven2/): Failed to transfer file 和PKIX path building failed: sun.secu

    <?xml version="1.0" encoding="UTF-8"?> <settings xmlns="http://mav ...

  4. 编写python时出现Non-ASCII character ‘\xe7‘ in file错误

    问题:在Ubuntu中编写python项目报错:Non-ASCII character '\xe7' in file 错误如下:错误定位到中文的注释 原因分析: 因为Python在默认状态下不支持源文 ...

  5. 如何用建木CI一键部署Java构件到Nexus

    介绍 继上一篇博客「开源人的福音」一键部署Java构件到Sonatype发布后,得到了很多小伙伴们的关注,我趁热打铁推出了它的姊妹篇如何用建木CI一键部署Java构件到Nexus,有别于上一篇,此篇博 ...

  6. (转)同一服务器部署多个tomcat时的端口号修改详情

    阅读目录 主要的几个端口 一机多部署需要修改的端口 背景:在同一个服务器上部署工程,总会遇到tomcat端口占用的情况,所有有必要分清楚各个端口的作用,和需要更改的端口. 同一服务器部署多个tomca ...

  7. 在Openstack上部署compute节点上时,开启服务openstack-nova-compute.service无法启动的解决方法

    在Openstack上部署compute节点上时,开启服务openstack-nova-compute.service无法启动的解决方法 参考文章: (1)在Openstack上部署compute节点 ...

  8. 《实施Cisco统一通信管理器(CIPT2)》一1.2 概述部署多站点环境时将会遇到的挑战...

    本节书摘来异步社区<实施Cisco统一通信管理器(CIPT2)>一书中的第1章,第1.2节,作者: [美]Chris Olsen 译者: 刘丹宁, CCIE#19920 , 卢铭 , 陈国 ...

  9. 同一服务器部署多个tomcat时的端口号修改详情

    2019独角兽企业重金招聘Python工程师标准>>> 同一服务器部署多个tomcat时,存在端口号冲突的问题,所以需要修改tomcat配置文件server.xml,以tomcat7 ...

最新文章

  1. HikariPool 连接池问题
  2. 20 亿个数字在 4G 内存中如何去重排序:快来试一试 BitMap
  3. LeetCode 1108. Defanging an IP Address--C++,Python解法
  4. dataset__getitem___PyTorch源码解析与实践(1):数据加载Dataset,Sampler与DataLoader
  5. 中国AI又夺一冠!依图刷榜全球声纹识别挑战赛,刷新纪录,大比分夺魁
  6. 妈妈帮携手神策数据 数据赋能打造母婴智能陪伴者
  7. 结对项目——电梯调度算法的实现和测试
  8. How to set up native subversion (javahl) with Subclipse on Mac OS X
  9. vue中v-on指令的使用之Vue知识点归纳(四)
  10. 可以分屏的软件_Screen分屏软件下载|Screen+专业分屏 免费版v1.4.25 下载
  11. C#部分类与部分方法
  12. SQLite数据库学习小结——Frameworks层实现
  13. html不用ajax怎么提交,停止HTML中JS AJAX功能提交按钮
  14. oracle gis费用,MapGIS 10 for Desktop 标准版_Oracle
  15. python3url编解码base64编解码ASE加解密
  16. poj3259 Wormholes floyd求负环
  17. IDEA全局配置图文教程
  18. 论文参考文献格式自动生成
  19. 无人机巡检技术要点解读,无人机巡检方案实现
  20. 第十一章 文件操作_C语言实现文件复制功能(包括文本文件和二进制文件)

热门文章

  1. 网上说的白帽子黑帽子都是什么?
  2. macbook双系统怎么装mysql_mac装win10双系统的方法_如何安装macos苹果和win10双系统...
  3. 锐捷(三)清除交换机的虚拟化(VSU)配置
  4. vscode报错http://127.0.0.1:5500/11.html 找不到应用程序
  5. windows硬盘数据安全处理工具
  6. 【MOTRIX】使用motrix下载百度云文件
  7. 弱口令总结(什么是弱口令)
  8. CSP-J冲刺 P1359 租用游艇
  9. 11大Java开源中文分词器的使用方法和分词效果对比,当前几个主要的Lucene中文分词器的比较...
  10. 通过app打包修改app名称