[转载]maven deploy 时出现 faild to transfer file错误

本文介绍了使用Maven部署构件到Nexus服务器时常见的“Failed to transfer file”错误及其解决方案,包括HTTP状态码405、401、403、400对应的错误原因与修正方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址: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.  
  7.     <server>
  8.       <id>nexus-snapshots</id>
  9.       <username>deployment</username>
  10.       <password>deploydv89</password>
  11.    </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条的做法。

### 如何在本地部署 HeyGem 要在本地环境中成功部署 HeyGem,可以参考以下方法和注意事项: #### 1. 安装必要的依赖项 确保安装了运行 HeyGem 所需的所有软件组件。这通常包括 Web 服务器、数据库以及构建工具等。例如,在 Linux 系统上可以通过 `yum` 或其他包管理器来完成 HTTPD(Apache)服务的安装[^1]。 ```bash sudo yum -y install httpd ``` 对于 Java 应用程序来说,还需要配置 Maven 和 Nexus 私有仓库用于管理和分发 JAR 文件。如果遇到类似于 “Failed to deploy artifacts: Could not transfer artifact” 的错误,则可能是由于网络连接问题或者认证失败引起的][^[^24]。 #### 2. 配置私有 Nexus 仓库 当您处于内网环境下工作,可能无法直接访问外部公共存储库。因此建议设置自己的内部 Nexus 实例作为代理或托管角色,并上传所需的第三方库至其中以便后续项目引用它们。 - 使用 mvn clean install 将生成的目标文件存放到本地 .m2/repository 中; - 修改 pom.xml 添加自定义 repository URL 指向您的 nexus 地址; ```xml <distributionManagement> <repository> <id>nexus-releases</id> <!-- 这里填写对应 id --> <url>http://your-nexus-server/content/repositories/releases/</url> </repository> </distributionManagement> <!-- 同也需要指定 snapshots 如果有的话 --> <snapshots> ... </snapshots> ``` 之后再次尝试执行 mvn deploy 即可解决传输失败的问题[^4]。 #### 3. 发布应用所需资源到目标位置 除了上述提到的技术栈之外,实际业务逻辑实现过程中还会涉及到许多定制化开发成果比如视图对象(View Object),实体对象(Entity Object)等等这些都需要妥善处理好其最终部署路径才能让整个系统正常运转起来[^3]。 具体操作如下: - **控制器类(Controller)** 及其它关联代码应放置于 `$JAVA_TOP/<path_of_your_file>` 下面相应目录结构当中去。 - 对于页面定义(Page Definition XML Files (*.PG.XML)) 则要迁移到 `$PROD_TOP/mds` 路径之下。 最后一步就是调用专门设计出来的导入脚本来完成剩余部分自动化流程啦! 通过以上步骤我们就可以顺利地把HeyGEM应用程序部署到了我们的局域网内的测试环境或者是生产环境之中去了。 ```python # 示例 Python 脚本展示如何验证部署状态 (假设存在这样的接口) import requests response = requests.get('http://localhost/status') if response.status_code == 200: print("Deployment Successful!") else: print(f"Error occurred:{response.text}") ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值