Maven

一、概述

1.Maven是什么?

Maven是一个一键式的自动化构建工具,包含自动下载jar包、多个项目同时的编译运行、提供自动化的测试插件、资源和配置文件的整合,打包和部署等功能。

2.Maven项目构建过程

1)清理:删除之前的编译结果,为重新编译做好准备。
2)编译:讲java程序编译为字节码文件。
3)测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的健壮性。
4)报告:在每一次测试后以标准的格式记录和展示测试结果。
5)打包:将一个包含诸多文件的工程封装成一个压缩文件用于安装或部署(java工程对应为jar包,web工程对应为war包)。
6)安装:在Maven环境下特指将jar包安装到本地仓库。这样该项目就可以被其他Maven项目通过gav坐标(依赖)访问。
7)部署:将jar包部署到私服上。
注:执行任意步骤,都会连带执行该步骤前的步骤

二、Maven核心功能和核心概念

1.Maven核心功能

Maven有两大核心功能,一个是项目构建,另一个是依赖管理。

2.POM(Project Object Model)

POM是Maven的核心组件,是以pom.xml文件的形式存在。其中包含了项目的相关属性,添加的依赖,引用的插件等。

3.约定的目录结构

所有的Maven项目必须遵循约定的目录结构,将源码和测试代码分开,例如下图:

image

注:目录中每个文件夹有自己对应的属性

4.GAV坐标和仓库

GAV坐标是资源的唯一定位,jar包存放的位置,访问资源时通过GAV坐标寻找。包括G--groupid(组织名称,一般是公司域名倒写),A--artifactid(项目名称),V--version(版本号)。本机存储jar包的位置为本地仓库,GAV坐标对应本地仓库中存放jar包的位置为:Maven本地仓库/groupid/artifactid/version/对应jar包。
例如servlet规范:

image
image

三、Maven工具

1.下载Maven地址(官网):http://maven.apache.org

2.环境变量配置

Maven同java一样需要配置本地环境变量(一个MAVEN_HOME和一个指向bin目录下的指令程序),先新建一个系统变量:MAVEN_HOME 值为bin的上级目录;再在Path中新建%MAVEN_HOME%\bin。测试:DOS中输出mvn -v显示Maven版本号即成功

3.Maven工具参数配置

在../conf/settings.xml文件中进行Maven工具的配置,例如:
1)本地仓库路径设置:

image

2)远程仓库设置:

image

3)配置jdk属性:

image

4.在集成开发工具中配置Maven

在Idea的设置(settings)中:

image

四、Maven的依赖管理

1.Maven依赖的范围属性

Maven的依赖构件包含一个依赖范围的属性(<scope>),这个属性描述的是三套classpath的控制(编译,测试,运行),即添加的jar的作用范围,分别为:compile,test,provided,runtime,system。
1)compile:编译依赖范围,如果没有指定,默认值就是compile,对于编译,测试,运行三种classpath都有效。

image

2)test:测试依赖范围,使用此依赖范围的maven依赖,只对编译测试,运行测试的classpath有效。例如:junit

image

3)provided:已提供依赖范围,表示项目运行的环境中已经提供了所需要的构件,对于此依赖范围的maven依赖,编译源码,编译测试,运行测试时都有效,但运行时无效。例如:servlet(web服务器都带有servlet-api,所有一般都是provided)

image

4)runtime:运行时依赖范围,使用此依赖范围的maven依赖,对于测试和运行项目的classpath有效,编译时无效。例如:jdbc驱动实现,项目编译时只需要提供JDK给出的jdbc接口,运行时才需要具体的实现类。

image

5)system:系统依赖范围,该依赖和provided依赖范围一样,但区别是必须通过<systemPath>元素显示本地指定依赖文件的路径(慎用)。

2.依赖传递

1)依赖具有传递性。例如:A项目中添加了B项目依赖,B项目中添加了C项目依赖,则A项目中通过依赖传销性添加了C项目依赖,若此时C项目中有添加mybatis依赖,则A项目中也有mybatis依赖,mybatis对于A项目来说就是间接依赖。
2)依赖传递对不同依赖范围的影响。
根据直接依赖的依赖范围不同(A项目中B项目的依赖范围和B项目中C项目的依赖范围),会导致间接依赖的依赖范围发生变化(A项目中C项目的依赖范围),总结如下:

image

3.依赖冲突

1)Maven项目中,依赖通常被定义在项目的pom.xml文件中,当多个依赖项引入不同版本的相同库时,就会发生依赖冲突。
2)解决方案:
版本锁定:在父工程中使用<dependencyManagement>进行版本锁定,例如SpringBoot项目:

image
image
image
image

段路径优先:A项目添加junit4.12,还有B项目的依赖,而B项目中还添加了junit4.13,则根据段路径优先的原则,A项目会使用junit4.12。
声明优先:A项目中添加了B项目依赖和C项目依赖,B项目中添加了junit4.12,C项目中添加了junit4.13,在该情况下junit4.12和junit4.13对A项目来说不存在短路金优先的原则,此时若B项目依赖先添加,就会使用junit4.12,C项目依赖先添加则使用junit4.13。
后来者居上:若A项目中依次添加junit4.11,junit4.12,junit4.13则A项目使用的是最后一个添加的junit4.13。
可选依赖:在依赖中添加<optional>元素,则被添加该元素的依赖不会发生依赖传递情况

五、Maven的继承与聚合

1.继承

Maven的依赖传递机制可以一定程度上简化pom的配置,但这仅局限于存在依赖关系的项目或模块中,当一个项目的多个模块都依赖于相同版本的jar,且这些模块之前不存在依赖关系时,就不能使用依赖传递机制。
Maven在设计时,,借鉴了java面向对象的继承思想,提出POM继承思想,当一个项目包含多个模块时,可以在该项目中创建一个父模块,在父POM中声明依赖,其他模块可以通过父模块的POM来获取相关依赖的声明。例如:SpringBoot项目。
子POM中可以继承父POM中的常见元素:groupid,version,properties(自定义Maven属性),dependencies,dependencyManagement,build

2.聚合

我们在开发过程中,创建了2个以上的模块,每个模块都是一个独立的maven project,在开始的时候我们可以独立的编译和测试运行每个模块,但是随着项目的不断变大和复杂化,我们期望能够使用简单的操作来完成编译等工作,这时Maven给出了聚合的配置方式。
使用Maven聚合功能对项目进行构建时,需要在该项目中额外创建一个聚合模块,然后通过这个模块构建整个项目所有模块。聚合模块仅仅是帮助聚合其他模块的工具,本身并没有任何项目功能,所有聚合模块中只有一个pom.xml文件,不包含src目录。

3.使用继承和聚合

父模块和聚合模块打包方式都是pom,聚合在聚合模块的pom.xml中<modules>元素中以当前pom.xml文件为起点添加子模块的模块名,而继承是在子模块的pom.xml中<parent>标签中添加父模块GAV坐标,实际情况中,通常会结合使用,即聚合模块和被聚合模块之间的目录结构是父子目录结构。
posted @ 2025-07-09 15:44  小心二次元T4z  阅读(8)  评论(0)    收藏  举报