具体怎样使用deploy命令部署构件到nexus服务器上可以参考经典的《Maven Definitive Guide》(Maven操作指南),书中的16.7节里面讲解的非常详细。假设我们在项目pom.xml文件中对maven服务器的设置信息如下:
-
<distributionManagement>
-
<repository>
-
<id>nexus-releases</id>
-
<name>Local Nexus Repository</name>
-
<url>http://192.168.1.99:8081/content/repositories/releases</url>
-
</repository>
-
<snapshotRepository>
-
<id>nexus-snapshots</id>
-
<name>Local Nexus Repository</name>
-
<url>http://192.168.1.99:8081/content/repositories/snapshots</url>
-
</snapshotRepository>
-
</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>,然后修改信息如下:
-
<server>
-
<id>nexus-releases</id>
-
<username>deployment</username>
-
<password>deploydv89</password>
-
</server>
-
<server>
-
<id>nexus-snapshots</id>
-
<username>deployment</username>
-
<password>deploydv89</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/目录下面,而不能放在${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部署错误对于开发者来说至关重要,因为这直接影响到项目的持续集成和交付流程。通过上述步骤,你应该能够成功地解决“repository element was not specified”这类错误,顺利完成Maven部署。...
- `mvn deploy`:将项目部署到远程仓库。 ### 使用阿里云镜像注意事项 - 确保阿里云镜像的URL正确无误,避免因配置错误导致下载失败。 - 当遇到某些特定的库阿里云镜像没有时,Maven会自动回退到官方中央仓库下载...
3. 更强的错误报告:增强了错误处理和报告,帮助开发者更快定位问题。 4. 兼容性提升:与Java 8及更高版本兼容,同时也支持旧版本Java。 四、安装与配置 1. 解压:将“apache-maven-3.3.9”解压缩到指定目录。 2. ...
- `mvn deploy`:将最终的项目部署到远程仓库。 ### 小结 Maven 3.3.9 提供了一个高效且稳定的构建环境,简化了Java项目管理。无论是新手还是经验丰富的开发者,都能从中受益。通过熟练掌握Maven,可以提高开发...
- 错误处理和日志记录更加精确,便于开发者定位问题。 - 对于依赖管理和冲突解决,Maven 3.8.5可能引入了新的策略或优化。 - 可能增强了对新版本的Java和其他构建工具的支持。 3. **压缩包内的文件结构** - **...
- `mvn deploy`:部署项目到远程服务器。 ** Maven报错及解决 ** 1. **依赖冲突**:Maven可能会因为不同库之间的依赖版本不一致导致问题。解决方法是使用`dependencyManagement`元素在POM中统一管理版本,或者使用...
6. `mvn deploy`:将最终产品部署到远程服务器。 ### 结语 Maven 3.6.0 版本为Java开发者带来了更高效、稳定的构建环境。理解并熟练使用Maven,可以极大地提升开发效率,简化项目管理。通过正确配置和利用其特性,...
- **部署**:`mvn deploy`将最终的工件发布到远程仓库。 4. Maven 的命令行工具: - `mvn help:effective-pom` 显示实际应用了所有继承和属性后的完整POM。 - `mvn dependency:tree` 展示项目的依赖树,帮助理解...
- `mvn deploy`:将最终的项目发布到远程仓库。 ** 自动化构建工程结构** Maven 提供了标准的目录结构,例如: - `src/main/java`:存放源代码。 - `src/main/resources`:放置资源文件。 - `src/test/java`:...
- 更强的错误处理:提供更详细的错误信息,帮助开发者更快定位问题。 - 改进的插件管理:支持更灵活的插件版本策略,允许在POM中指定插件的执行顺序。 - 与其他工具的集成:加强了与IDE(如Eclipse、IntelliJ ...
- `mvn deploy`:将项目部署到远程仓库。 **4. Maven 的应用场景:** - **多模块项目管理**:Maven 可以轻松地管理包含多个子项目的大型项目结构。 - **自动化构建**:通过配置POM,Maven 可以自动完成编译、测试、...
4. **执行构建**:通过命令如`mvn clean compile`、`mvn test`、`mvn install`或`mvn deploy`来执行构建的不同阶段。 5. **解决依赖冲突**:如果遇到依赖冲突,可以使用`mvn dependency:tree`查看依赖树,然后通过...
- 使用 `mvn deploy` 命令将打包后的 JAR 文件部署到远程仓库。 - 需要在 POM 文件中配置 `<distributionManagement>` 元素来指定远程仓库的 URL。 #### 九、高级主题 1. **多模块项目构建**: - Maven 支持...
- `mvn deploy`:将项目部署到远程仓库。 ### 总结 Maven 3.6.1 是一个强大的Java项目管理工具,通过POM和Maven仓库简化了构建过程。下载并正确安装后,开发者可以利用其自动化功能,专注于编写代码,而无需过多...
- `mvn deploy`:将项目发布到远程仓库。 ** 总结 ** Maven 3.8.1 作为最新的 Maven 版本,提供了更稳定和高效的构建环境,无论是在 Windows 还是 Linux 平台上,都有简单一致的安装和配置流程。通过 POM 文件管理...
4. **发布到远程仓库**: 使用 `mvn deploy` 可以将构建好的项目发布到远程仓库供其他项目使用。 ### 五、Maven 的插件 - **maven-compiler-plugin**: 编译源代码。 - **maven-surefire-plugin**: 运行单元测试。 -...
4. **部署**:使用`mvn deploy`命令将项目部署到远程仓库。 Apache Maven 3.3.9在Linux环境中的应用,简化了Java项目的构建和管理流程,为开发者提供了高效、自动化的工作方式。无论是小型项目还是大型企业级项目,...
4. 部署应用:使用`mvn deploy`将构建产物发布到远程仓库。 5. 使用本地仓库:Maven默认在用户目录下创建一个`.m2`目录,用于存储下载的库文件和本地构建的项目。 6. 配置Maven:可以通过`settings.xml`文件自定义...
5. **部署项目**:`mvn deploy`将最终的包发布到远程仓库。 **配置Maven** 1. **pom.xml**:项目根目录下的pom.xml文件是项目的配置中心,可在此定制构建过程,管理依赖。 2. **settings.xml**:个人配置文件,...
3. **增强的POM解析**: Maven 3.0.4改进了POM解析的错误处理,提供了更清晰的错误信息,帮助开发者快速定位问题。 4. **插件管理系统**: 提供了更灵活的插件管理和版本控制,开发者可以为每个插件指定不同的版本。 ...