`
JetMah
  • 浏览: 72843 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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服务器的设置信息如下:

  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条的做法。

 

 

 

参考资料:
maven 中 部署构件至Nexus(mvn deploy)
Maven2中需要注意的问题
maven deploy到nexus私服出错问题
Maven Tips and Tricks: Encrypting Passwords
Maven – Password Encryption

2
1
分享到:
评论

相关推荐

    maven nexus私服构件示例

    通过这个示例,开发者可以学习到如何配置Maven的settings.xml以使用Nexus,如何在pom.xml中指定构件的部署目标,以及如何在开发流程中有效地利用Nexus管理依赖。此外,Nexus还提供了高级功能,如版本控制、权限管理...

    ECLIPSE实现MAVEN项目自动部署NEXUS中

    ### Eclipse 实现 Maven 项目自动部署到 Nexus 在软件开发过程中,自动化构建和部署是非常重要的环节,能够极大地提高开发效率并减少人为错误。本篇文章主要介绍如何利用 Eclipse 和 Maven 将本地项目自动部署到 ...

    maven 私服 nexus3 安装包

    2. **部署构件**:通过 Maven 的 deploy 命令,可以直接将本地的 JAR 包部署到 Nexus 托管仓库,如: ``` mvn deploy:deploy-file -Durl=file:///path/to/nexus/content/repositories/my-repo -Dfile=my-artifact....

    nexus 搭建 maven仓库

    nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库nexus 搭建 maven仓库

    maven3.8.3+nexus3.34.zip

    标题"Maven3.8.3+nexus3.34.zip"和描述中提及的是一个包含Maven 3.8.3版本和Nexus 3.34版本的压缩包文件,适用于Windows 64位操作系统。这两个工具在软件开发,尤其是Java开发中扮演着重要角色。以下是关于Maven和...

    Maven Nexus 私服搭建

    Maven Nexus 私服搭建 从零开始,资源下载、安装指导、开发配置说明

    手动搭建maven私服-安装配置nexus 3.4教程

    手动搭建maven私服是指使用nexus 3.4安装配置一个maven私服,实现公司或个人项目的构件管理。下面将详细介绍手动搭建maven私服的过程。 一、安装nexus 3.4 首先下载nexus 3.4安装包,并将其解压到指定目录下。解压...

    配置maven私服nexus

    对于私有仓库,可能还需要在settings.xml中添加仓库服务器和部署服务器的信息,以便Maven能够推送构件到Nexus。 最后,为了确保安全性和提高性能,还可以根据实际需要对Nexus进行一些额外的配置。例如,配置备份...

    maven私服搭建-nexus的部署

    maven私服搭建-nexus的部署 Maven 私服是指在局域网或 Intranet 中搭建的 Maven 仓库,用于存储和管理项目依赖的 Jar 包。Nexus 是一个流行的 Maven 私服解决方案,提供了强大的仓库管理功能。 在本文中,我们将...

    maven结合nexus部署文档

    在 Nexus 界面中,你可以创建不同类型的仓库,如 Maven2 hosted、proxy 或 group,以满足不同需求。例如,创建一个 hosted 仓库用于存放团队内部的私有构件,proxy 仓库代理外部的 Maven 中央仓库。 **四、Maven ...

    Nexus搭建Maven私服 +maven安装步骤

    Nexus 搭建 Maven 私服可以帮助开发团队更好地管理项目依赖项和构件,提高项目构建和部署的效率。通过本文,我们了解了 Nexus 的功能和安装步骤,以及如何创建 Nexus 仓库和修改 Maven 配置文件以便从 Nexus 下载...

    maven私服tar包(nexus_linux).zip

    3. 发布构件到Nexus时,需要配置POM.xml中的`distributionManagement`元素,并遵循Nexus的部署策略。 **维护与管理** 1. 管理员可以在Nexus界面中创建和管理不同的仓库,比如添加新的Maven仓库类型,如Release或...

    Maven私服nexus安装包

    2. **部署构件**:使用Maven的`deploy`目标,将项目构件部署到Nexus的宿主仓库。这需要在`pom.xml`中配置正确的部署URL和认证信息。 3. **配置Maven settings.xml**:为了让Maven知道如何从Nexus获取依赖,需要在...

    Maven本地仓库搭建工具nexus-2.11.4-01-bundle

    2. **配置环境变量**:为了方便命令行操作,可以将Nexus的bin目录添加到系统PATH环境变量中。 3. **启动Nexus**:在解压后的目录中找到`nexus.exe`(Windows)或`nexus.sh`(Linux/Unix),运行它来启动Nexus服务。...

    nexus maven内部库配置安装手册

    - **通过Maven部署**:配置Maven项目,通过构建过程自动部署构件到Nexus。 - **搜索构件**:利用Nexus提供的搜索功能,可以快速查找所需的构件。 - **Nexus监听端口配置**:根据需求调整Nexus的服务监听端口。 -...

    maven-nexus

    7. **构建服务**: Nexus 可以与持续集成工具(如 Jenkins、Hudson)集成,提供自动构件部署和验证功能。 ** 安装与配置 Nexus ** Nexus 的安装通常涉及解压下载的压缩包(如 `nexus-2.3.0-04`),然后启动服务器。...

    Jenkins编译报错Failed to execute goal org.apache.maven.plugins_maven-clean-plugin

    Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean (default-clean) on project

    nexus构建maven仓库总结(完善版2)

    创建仓库时,需要选择仓库类型,如Maven2/3或NPM等,并设置访问权限。对于宿主仓库,通常会创建一个或多个仓库来分别存放不同类型的构件,如jar、pom、sources和javadoc。 同时,了解Maven的基本命令也是必要的。...

    maven+nexus完整手册

    - 地址:`http://repo1.maven.org/maven2/` 2. **宿主仓库**:用于存放内部项目依赖。包括: - **3rdParty**:用于存储组织内找不到的第三方依赖,如 Oracle JDBC 驱动等。 - **Releases**:存放组织内部发布的...

Global site tag (gtag.js) - Google Analytics