1.概述
在上一篇文章中 ,我讨论了Maven项目如何在本地安装尚未部署在Maven Central(或任何其他大型且公共托管的存储库)上的第三方jar。 该解决方案仅适用于小型项目,在这些项目中安装,运行和维护完整的Nexus服务器可能会显得过大。 但是,随着项目的发展,Nexus很快成为托管第三方工件以及跨开发流重用内部工件的唯一真正成熟的选择。 本文将展示如何使用Maven将项目工件部署到Nexus 。
2. pom中的Nexus要求
为了使Maven能够部署在构建的打包阶段中创建的工件,它需要通过distributionManagement元素定义存储库信息,将在其中部署打包的工件:
<distributionManagement><snapshotRepository><id>nexus-snapshots</id><url>http://localhost:8081/nexus/content/repositories/snapshots</url></snapshotRepository>
</distributionManagement>
托管的公共Snapshots存储库在Nexus上是开箱即用的,因此无需进一步创建或配置任何内容。 Nexus使确定其托管存储库的URL变得容易-每个存储库在“ 摘要”标签下的项目pom的<distributionManagement>中显示要添加的确切条目。
3.插件
默认情况下,Maven通过maven-deploy-plugin处理部署机制-该映射到默认Maven生命周期的部署阶段:
<plugin><artifactId>maven-deploy-plugin</artifactId><version>2.7</version><executions><execution><id>default-deploy</id><phase>deploy</phase><goals><goal>deploy</goal></goals></execution></executions>
</plugin>
maven-deploy-plugin是解决将项目部署到Nexus的任务的可行选择,但是它并不是为了充分利用Nexus提供的功能而构建的。 因此,Sonatype构建了一个Nexus专用插件-nexus-staging-maven-plugin ,该插件实际上旨在充分利用Nexus必须提供的更高级的功能-分期等功能。
尽管对于简单的部署过程,我们不需要暂存功能,但我们将继续使用此自定义Nexus插件,因为该插件的创建明确目的是与Nexus良好地沟通。 使用maven-deploy-plugin的唯一原因是在将来保持打开使用Nexus替代产品的选项,例如Artifactory存储库。 但是,与在项目的整个生命周期中可能实际更改的其他组件不同,Maven存储库管理器极不可能更改,因此不需要灵活性。 因此,在部署阶段使用另一个部署插件的第一步是禁用现有的默认映射:
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-deploy-plugin</artifactId><version>${maven-deploy-plugin.version}</version><configuration><skip>true</skip></configuration>
</plugin>
现在,我们可以定义:
<plugin><groupId>org.sonatype.plugins</groupId><artifactId>nexus-staging-maven-plugin</artifactId><version>1.3</version><executions><execution><id>default-deploy</id><phase>deploy</phase><goals><goal>deploy</goal></goals></execution></executions><configuration><serverId>nexus</serverId><nexusUrl>http://localhost:8081/nexus/</nexusUrl><skipStaging>true</skipStaging></configuration>
</plugin>
插件的部署目标映射到Maven构建的部署阶段。 还要注意, 如前所述,在将-SNAPSHOT工件简单部署到Nexus时,我们不需要分段功能,因此可以通过<skipStaging>元素将其完全禁用。
4.全局
部署到Nexus是一项安全的操作 -为此,在任何Nexus实例上都存在开箱即用的部署用户。 无法使用该部署用户的凭据来配置Maven,以便它可以与Nexus正确交互,这不能在项目的pom.xml中完成。 这是因为pom的语法不允许这样做,更不用说pom可能是公共工件的事实,因此不太适合保存凭证信息。
服务器的凭证必须在全局Maven setting.xml中定义:
<servers><server><id>nexus-snapshots</id><username>deployment</username><password>the_pass_for_the_deployment_user</password></server>
</servers>
还可以鼓励服务器使用基于密钥的安全性,而不是原始和纯文本凭据。
5.部署过程
执行部署过程很简单:
mvn clean deploy -Dmaven.test.skip=true
在部署作业的环境中,跳过测试是可以的,因为该作业应该是该项目的部署基准线中的最后一个作业。 这种部署管道的一个常见示例是一连串的Jenkins作业,每个作业只有在成功完成后才触发下一个作业。 因此,管道中的先前作业有责任运行项目中的所有测试套件-到部署作业运行时,所有测试都应该已经通过。
如果只运行一个命令,则可以在部署阶段执行之前使测试保持活动状态以运行:
mvn clean deploy
六,结论
这是将Maven工件部署到Nexus的简单但高效的解决方案。 它也有些怪异-使用nexus-staging-maven-plugin代替默认的maven-deploy-plugin ; 分阶段功能被禁用等–正是这些选择使解决方案变得简单实用。 潜在地激活完整的登台功能可能是将来文章的主题。 最后,我们将在下一篇文章中讨论发布过程。
翻译自: https://www.javacodegeeks.com/2013/05/maven-deploy-to-nexus.html