Maven中<distributionManagement>的使用及说明
作者:对酒当歌丶人生几何
SNAPSHOT仓库与RELEASE仓库的区别
我们在开发软件阶段时会在POM文件中导入很多依赖公共库,这些公共库可能随时需要修改并发布,可能一天就要发布一次甚至一天要发布N次。
对与采用maven来管理依赖公共库时,由于maven的依赖管理是基于版本管理(version),如果我们本地已经存在了公共库的依赖,那么即使内部服务器上的组件发生变化,在本地与服务器上依赖版本相同的情况下,maven不会再去内部服务器上拉取最新的依赖,也就是说无法实时将服务器上的更新同步到本地。
如果要解决这个问题,就需要升级组件的版本号(version),可这样就明显不符合要求和实际情况了,而SNAPSHOT快照版本,就可以解决这个问题,对于每次内部服务器上更新了组件,本地都会去重新拉取一遍。
在maven中的仓库分为两种:
- snapshot快照仓库
- release发布仓库
snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本(比如Spring、SpringBoot)。
定义一个组件/模块为快照版本,只需要在pom文件中在该模块的版本号后加上-SNAPSHOT即可,如下:
<modelVersion>4.0.0</modelVersion> <groupId>com.seeker</groupId> <artifactId>data-export-center</artifactId> <packaging>pom</packaging> <version>1.0.0-SNAPSHOT</version>
maven会根据模块的版本号(version)中是否带有-SNAPSHOT来判断是快照版本还是正式版本。
如果是快照版本,那么在mvn deploy时会自动发布到快照版本库中,而使用快照版本的模块,在不更改版本号的情况下,直接编译打包时,maven会自动从镜像服务器上下载最新的快照版本。
那么如果是正式发布版本(release),那么在mvn deploy时会自动发布到正式版本库中,而使用正式版本的模块,在不更改版本号的情况下,编译打包时如果本地已经存在该版本的模块则不会主动去镜像服务器上下载。
所以,我们在开发阶段,可以将公用库的版本设置为快照版本,而被依赖组件则引用快照版本进行开发,在公用库的快照版本更新后,我们也不需要修改pom文件提示版本号来下载新的版本,直接mvn执行相关编译、打包命令即可重新下载最新的快照库了,从而也方便了我们进行开发。
distributionManagement定义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"> <parent> <groupId>com.seeker</groupId> <artifactId>common-server</artifactId> <version>2.0.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <groupId>com.seeker</groupId> <artifactId>data-export-center</artifactId> <packaging>pom</packaging> <version>${project.release.version}</version> /** 子模块 */ <modules> XXXXXXX </modules> /** 自定义属性 */ <properties> <spring.version>5.1.9.RELEASE</spring.version> <project.release.version>1.0.0SNAPSHOT</project.release.version> </properties> /** 统一依赖版本,子模块可以不用写版本号 */ <dependencyManagement> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>${spring.version}</version> </dependency> <dependencyManagement> <profiles> <profile> <id>release</id> <properties> <project.release.version>2.0.0RELEASE</project.release.version> </properties> </profile> </profiles> /** <!--定义snapshots仓库和releases仓库的地址--> */ <distributionManagement> <repository> <id>huawei</id> <url>https://huaweiCloud.com.cn/artifactory/seeker/</url> </repository> <snapshotRepository> <id>seekerWorkds</id> <url>https://seeker.top.com.cn/artifactory/seeker/</url> </snapshotRepository> </distributionManagement>
首先我们看到pom文件中version的定义是采用占位符的形式,这样的好处是可以根据不同的profile来替换版本信息,比如maven默认是使用1.0.0SNAPSHOT作为该模块的版本,如果在发布时使用mvn deploy -P release 的命令,那么会自动使用2.0.0RELEASE作为发布版本,那么根据maven处理snapshot和release的规则,由于版本号后不带-SNAPSHOT故当成是正式发布版本。
会被发布到release仓库,在distributionManagement段中配置的是snapshot快照库和release发布库的地址。
对于版本库主要是id和url的配置,配置完成后就可以通过mvn deploy进行发布了。
Maven常用命令及其作用
maven clean
:对项目进行清理,删除target目录下编译的内容(将以前编译得到的旧文件class字节码文件删除)。maven compile
:编译项目源代码,将JAVA源程序编译成class文件。maven test
:对项目进行运行测试。maven packet
:打包文件并存放到项目的target目录下,打包好的文件通常都是编译后的class文件。maven install
:在本地仓库生成仓库的安装包,可供其他项目引用,同时打包后的文件放到项目的target目录下。maven deploy
:可以将maven所打的jar包上传到远程的repository,便于其他开发者和工程共享。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。