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项目必须遵循约定的目录结构,将源码和测试代码分开,例如下图:
注:目录中每个文件夹有自己对应的属性
4.GAV坐标和仓库
GAV坐标是资源的唯一定位,jar包存放的位置,访问资源时通过GAV坐标寻找。包括G--groupid(组织名称,一般是公司域名倒写),A--artifactid(项目名称),V--version(版本号)。本机存储jar包的位置为本地仓库,GAV坐标对应本地仓库中存放jar包的位置为:Maven本地仓库/groupid/artifactid/version/对应jar包。
例如servlet规范:
三、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)本地仓库路径设置:
2)远程仓库设置:
3)配置jdk属性:
4.在集成开发工具中配置Maven
在Idea的设置(settings)中:
四、Maven的依赖管理
1.Maven依赖的范围属性
Maven的依赖构件包含一个依赖范围的属性(<scope>
),这个属性描述的是三套classpath的控制(编译,测试,运行),即添加的jar的作用范围,分别为:compile,test,provided,runtime,system。
1)compile:编译依赖范围,如果没有指定,默认值就是compile,对于编译,测试,运行三种classpath都有效。
2)test:测试依赖范围,使用此依赖范围的maven依赖,只对编译测试,运行测试的classpath有效。例如:junit
3)provided:已提供依赖范围,表示项目运行的环境中已经提供了所需要的构件,对于此依赖范围的maven依赖,编译源码,编译测试,运行测试时都有效,但运行时无效。例如:servlet(web服务器都带有servlet-api,所有一般都是provided)
4)runtime:运行时依赖范围,使用此依赖范围的maven依赖,对于测试和运行项目的classpath有效,编译时无效。例如:jdbc驱动实现,项目编译时只需要提供JDK给出的jdbc接口,运行时才需要具体的实现类。
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项目的依赖范围),总结如下:
3.依赖冲突
1)Maven项目中,依赖通常被定义在项目的pom.xml文件中,当多个依赖项引入不同版本的相同库时,就会发生依赖冲突。
2)解决方案:
版本锁定:在父工程中使用<dependencyManagement>
进行版本锁定,例如SpringBoot项目: