mven发布目标仓库配置说明
一、问题引出
问题:使用 nexus 私服后,如何控制编写的公共组件发布到 SNAPSHOT 仓库还是 RELEASE 仓库?
既项目的pom.xml文件中如何配置mvn deploy 操作后是发布到 SNAPSHOT 仓库还是 RELEASE 仓库中
二、为什么
在使用maven过程中,在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一天要发布N次。如果在开发阶段都是基于正式发布版本来做依赖管理,那么在公共库的使用方就需要每次都升级组件的版本号,可这样就很明显不符合要求和实际开发情况。
如果基于快照版本,那就没有这些问题,maven 对 SNAPSHOT 版本的依赖,是有定时检查与比较的策略的。
maven 中的仓库分为两种,**SNAPSHOT 仓库 **用于保存开发过程中的不稳定版本的项目和 RELEASE 发布仓库用来保存稳定的发行版本。
maven会根据版本号(pom文件中的version标签)中是否含有-SNAPSHOT
来判断是快照版/正式版
如果是 SNAPSHOT 版,在mvn deploy时会自动发布到 SNAPSHOT 仓库,而使用 SNAPSHOT 版的模块,在不更改版本号的情况下编译打包时 maven 会自动与镜像服务器上的依赖库的发布时间进行检查与比对,如果仓库中的时间最新就会下载到本地替换掉原来老旧的,反之则不会替换。
如果是 RELEASE 版,在mvn deploy时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下编译打包时 如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。
所以在开发阶段,最好把公用库的版本设置为 SNAPSHOT 版本,使用侧也引入快照版本的库,在公用库更新后,也不需要修改pom文件公共库的版本号来下载新的版本,直接mvn执行相关编译、打包命令即可重新下载最新的快照库了,方便开发。
接下来要介绍的是如何在项目中应用 SNAPSHOT 和 RELEASE 库,应用 SNAPSHOT 和 RELEASE 库达到不同环境下发布不同的版本的目的,首先看一个pom文件的定义:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId>
<artifactId>join</artifactId>
<version>${project.version}</version>
<packaging>jar</packaging>
<properties>
<!-- 定义快照版本号 -->
<project.version>0.1-SNAPSHOT</project.version>
</properties>
<profiles>
<!-- 使用该命令触发配置 mvn deploy -P RELEASE-->
<profile>
<id>RELEASE</id>
<properties>
<!-- 配置片段定义 发布版本号 -->
<project.version>0.1</project.version>
</properties>
</profile>
</profiles>
<!--发布配置管理-->
<distributionManagement>
<!--发行库(稳定版)-->
<repository>
<id>releases</id>
<name>releases</name>
<url>http://192.168.2.201:6701/repository/maven-releases/</url>
</repository>
<!--快照库(不稳定版)-->
<snapshotRepository>
<id>snapshots</id>
<name>snapshots</name>
<url>http://192.168.2.201:6701/repository/maven-snapshots/</url>
</snapshotRepository>
</distributionManagement>
</project>
首先看到 pom 文件中 version 的定义是采用占位符的形式,这样的好处是可以根据不同的profile来替换版本信息,比如默认是使用0.1-SNAPSHOT作为该模块的版本。
1、如果发布时使用 mvn deploy -P RELEASE 命令,那么会自动使用0.1作为发布版本,那么根据 maven 处理SNAPSHOT 和 RELEASE 的规则,因版本号不带-SNAPSHOT
后缀,就认为是发布版,就发布到 RELEASE 仓库;
2、如果发布时使用mvn deploy命令,会使用版本号 0.1-SNAPSHOT,此时maven会认为是快照版本,就发布到快照版本库。
在distributionManagement段中配置的是snapshot快照库和release发布库的地址,这里是采用nexus作为镜像服务器。对于版本库主要是id和url的配置,配置完成后就可以通过mvn deploy进行发布了,当然了,如果你的镜像服务器需要用户名和密码,那么还需要在maven的settings.xml文件中做如下配置:
<servers>
<server>
<id>releases</id>
<username>dev</username>
<password>dev</password>
</server>
<server>
<id>snapshots</id>
<username>dev</username>
<password>dev</password>
</server>
</servers>
注意settings.xml
的 server 对象的 id 值必须
和 pom.xml 文件中的 distributionManagement 对应仓库的id保持一致,maven在处理发布时会根据 id 查找用户名称和密码进行登录和文件的上传发布。
这里通过profile的定义就可以在发布灵活切换SNAPSHOT 版本和 RELEASE 版本了,在使用侧也可以使用profile来定义在开发阶段使用快照库,在发布阶段使用正式库的功能,只需要在不同的profile中覆盖默认的properties属性值即可。
最后在其它项目中使用快照版本的公共依赖时添加pom依赖:
<dependency>
<groupId>com</groupId>
<artifactId>join</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>