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>
posted @ 2022-08-01 18:16  黄河大道东  阅读(160)  评论(0编辑  收藏  举报