maven生命周期及命令用法、maven工程中依赖的传递及依赖冲突的解决
生命周期

一个项目的构建build的过程通常包括:清理、编译、测试、打包、部署等
Maven定义了三套生命周期:
clean:处理项目的清理工作,主要命令是clean
default:处理项目的deploy,主要命令:compile、test、package、install
site:处理网站站点的创建,主要命令:site
命令用法
每个生命周期之间是互相独立,比如:直接执行package,不会执行clean
每个生命周期内都包含多个阶段,这些阶段是有顺序的,后续的阶段必须等待前面的阶段执行后才能执行(一个生命周期内,比如default阶段,执行package,会执行前面的compile、test,再执行package,可以简写为:package;一般是再加上前一个生命周期clean,所以简写为:clean package)
不执行测试用例:mvn clean package -Dmaven.test.skip=true
自定义maven命令




maven中scope
scope在maven的依赖管理中主要负责项目的部署,scope的分类:
1.compile:默认值,他表示被依赖项目需要参与当前项目的编译,还有后续的测试,运行周期也参与其中,是一个比较强的依赖。打包的时候通常需要包含进去
2.test:依赖项目仅仅参与测试相关的工作,包括测试代码的编译和执行,不会被打包,例如:junit
3.runtime:表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。与compile相比,跳过了编译而已。例如JDBC驱动,适用运行和测试阶段
4.provided:打包的时候可以不用包进去,别的设施会提供。事实上该依赖理论上可以参与编译,测试,运行等周期。相当于compile,但是打包阶段做了exclude操作
5.system:从参与度来说,和provided相同,不过被依赖项不会从maven仓库下载,而是从本地文件系统拿。需要添加systemPath的属性来定义路径
依赖传递
创建一个maven工程

依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
下面出现了spring-webmvc以外的其他jar。那是因为我们的项目依赖spring-webmvc.jar,而spring-webmvc.jar会依赖spring-beans.jar等等,所以spring-beans.jar等jar包也出现在了我们的maven工程中, 这种现象我们称为依赖传递。从下图中可看到他们的关系:

查看依赖


依赖冲突的解决
在pom中,spring-webmvc下再添加一个spring-context的依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
</dependencies>

omitted for duplicate表示和别的jar包版本冲突了,而该jar包不被引入

下面红色的就是被忽略的


我们会发现这两个jar包同时都依赖了spring-beans,但是spring-webmvc依赖spring-beans是4.3.14.RELEASE,spring-context依赖spring-beans是5.3.18,但是发现spring-beans:4.3.14.RELEASE加入到工程中。而我们希望spring-beans:5.3.18加入工程,这就造成了依赖冲突。
解决依赖冲突有以下原则:
依赖调解原则
maven自动按照下边的原则调解:
1、第一声明者优先原则
在 pom 文件定义依赖, 先声明的依赖为准。
测试:
如果将上边spring-webmvc和spring-context顺序交换一下,系统将导入spring-beans:5.3.18
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>


例如: 还是上述情况,spring-contex和spring-webmvc都会传递过来spring-beans,那如果直接把spring-beans的依赖直接写到pom文件中, 那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近(人工直接声明的优先)。
根据路径近者优先原则,系统将导入spring-beans:5.3.18
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.3.18</version>
</dependency>
</dependencies>


依赖排除
比如在依赖spring-webmvc的设置中添加排除依赖,排除spring-beans,
下边的配置表示:依赖spring-webmvc,但排除spring-webmvc所依赖的spring-beans。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.18</version>
</dependency>
</dependencies>


锁定版本
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素,可以采用直接锁定版本的方法确定依赖构建的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。如下的配置是锁定了spring-webmvc和spring-context的版本:
用dependencyManagement管理项目中的依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
但是,依赖都没了


我们还可以把版本号提取出来,使用标签设置成变量。
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.3.14.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加<dependencies></dependencies>标签,但是不需要再指定版本,因为已在 <dependencyManagement> 中锁定了版本,如下:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
<spring.version>4.3.14.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
</dependencies>
原文会持续更新,原文地址:https://www.cnblogs.com/uncleyong/p/16820993.html
__EOF__
关于博主:擅长性能、全链路、自动化、企业级自动化持续集成(DevTestOps)、测开等
面试必备:项目实战(性能、自动化)、简历笔试,https://www.cnblogs.com/uncleyong/p/15777706.html
测试提升:从测试小白到高级测试修炼之路,https://www.cnblogs.com/uncleyong/p/10530261.html
欢迎分享:如果您觉得文章对您有帮助,欢迎转载、分享,也可以点击文章右下角【推荐】一下!

浙公网安备 33010602011771号