1.maven简介
Maven是一个基于Java的工程构建工具,用于管理和构建项目的依赖关系。它提供了一种标准的项目结构和一组约定,使得项目的开发、构建、部署和文档化更加容易和可靠。
Maven的主要功能包括:
-
依赖管理:Maven可以自动下载和管理项目所需的依赖库。通过声明项目的依赖关系,Maven可以自动解决依赖冲突,并下载和安装所需的库。
-
构建管理:Maven可以自动执行项目的构建过程,包括编译、测试、打包、部署等操作。Maven使用插件来执行这些操作,可以根据项目的需要灵活配置和扩展。
-
团队协作:Maven支持多人协作开发,可以通过中央仓库和本地仓库共享项目的依赖库。同时,Maven提供了一些插件,可以用于集成和持续集成等开发实践。
2.生命周期
Maven生命周期是指Maven构建过程中的一系列阶段,每个阶段执行不同的任务。Maven生命周期分为三个主要阶段:Clean(清理)、Build(构建)和Site(站点)。
-
Clean阶段:在这个阶段,Maven会清理项目中的所有生成的文件,以确保从一个干净的状态开始构建。主要包括清理输出目录和临时文件等。clean阶段只有一个目标:clean。
-
Build阶段:这个阶段是Maven构建的核心阶段。它包括了项目的编译、测试、打包等操作。
- validate:验证项目是否正确且是否可以构建。
- compile:编译项目的源代码。
- test:运行项目的单元测试。
- package:将编译后的源代码打包成可分发的格式,如JAR、WAR等。
- install:将打包好的文件安装到本地仓库,供其他项目使用。
- deploy:将打包好的文件部署到远程仓库,供其他开发人员使用。
-
Site阶段(冷门功能):这个阶段用于生成项目的站点文档,包括项目的API文档、用户手册等。它可以生成静态HTML或者部署到web服务器上。
- site:生成项目的站点文档。
- site-deploy:将站点文档部署到web服务器上。
每个阶段都由一个或多个插件来执行,这些插件在Maven的POM文件中配置。
Maven的生命周期是顺序执行的,你可以选择在某个生命周期中定义特定的插件执行某个任务。例如,在Build阶段的compile阶段可以配置编译插件,test阶段可以配置测试插件来运行单元测试。
3.下载与安装
3.1官网下载
大部分Java IDE都有一个嵌入式maven,例如IDEA。如果不需要命令行操作,则无需额外下载。
maven本身是java开发的,必须先安装jdk环境。
官网下载 --> maven
下载之后,解压缩到指定目录即可。
3.2配置环境变量
如果需要在命令行操作,则需要配置环境变量(以win10系统做演示)。
3.2.1.前往系统属性,我的电脑->计算机->系统属性
3.2.2.搜索环境变量
3.2.3.配置环境变量
新增环境变量,命名为MAVEN_HOE,指向maven的安装目录 (不包含bin目录)
Path环境变量添加一项,“%MAVEN_HOME%\bin”
3.2.4.验证环境变量,命令行输入 "mvn -version"
3.2.5修改本地仓库地址
maven默认本地仓库地址为:usr/.m2/repository。由于本地仓库的默认位置是在用户的家目录下,一般在C盘。随着时间推移,仓库体积越来越庞大,影响系统性能。所以强烈建议将 Maven 的本地仓库放在其他驱动盘。maven安装目录config下的settings.xml文件,修改<localRepository>标签,指向新目录。
3.2.6修改远程仓库镜像地址
Maven中央仓库在境外,而国外网站速度很慢。可改成阿里云(或腾讯云等)提供的镜像仓库,提高下载速度。配置的方式也在settings.xml文件里。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
4.maven核心概念
4.1项目对象模型(POM)
POM是Maven项目的核心文件,以XML格式编写。它定义了项目的基本信息、依赖关系、构建配置等。POM文件必须位于项目根目录下,并且命名为pom.xml。
4.2坐标(Coordinate)
坐标用于唯一标识一个Maven项目或者项目的依赖关系。坐标包括groupId、artifactId和version三个元素。groupId用于标识项目所属的组织或者团队,artifactId用于标识项目的名称,version用于标识项目的版本号。
4.3插件(Plugins)
Maven插件是用于执行项目构建过程中的具体任务的工具。Maven有很多内置插件,也可以自定义插件。插件的执行由Maven生命周期的不同阶段触发。
4.4构建目录结构
Maven推荐的项目目录结构有一定的约定,包括src/main/java用于存放项目的源代码,src/test/java用于存放单元测试代码,以及其他一些目录用于存放配置文件、资源文件等。
4.5依赖范围
-
compile(默认): 该依赖项在编译、测试和运行时都可用。
-
test: 该依赖项只在测试阶段可用,不会被打包到生成的项目中。
-
provided: 该依赖项在编译和测试阶段可用,但在运行时由JDK或某个服务器提供。比如servlet-api可以由服务器提供。
-
runtime: 该依赖项在运行时可用,但不参与编译和测试阶段。
-
system: 该依赖项类似于provided,但需要手动提供jar文件的路径。不推荐使用该范围。
-
import: 该依赖项只用于父项目的dependencyManagement部分。它引入了一个外部项目的依赖管理。
4.6依赖传递
Maven依赖传递是指当一个项目依赖于其他项目时,它将自动获取所依赖项目的依赖项。Maven使用依赖传递来管理项目依赖关系并确保所有需要的依赖项都被正确地获取和使用。
依赖传递有以下几个特点:
-
传递性:如果项目A依赖于项目B,而项目B又依赖于项目C,则项目A将间接依赖于项目C。Maven会自动解析和获取项目C的依赖项。
-
依赖冲突解决:当多个依赖项具有相同的groupId和artifactId,但版本不同时,Maven将根据一定的冲突解决策略选择一个版本。默认情况下,它选择最近的版本。
-
排除依赖项:有时候,可能需要排除某个依赖项的传递性依赖,在pom.xml文件中使用<exclusions>标签可以指定需要排除的依赖项。
4.7依赖冲突
4.7.1依赖冲突选择策略
由于依赖的传递性,导致不同依赖的子依赖会出现版本问题,有可能你以为依赖了版本2.1,但因为出现冲突,实际生效的版本是1.2。
Maven有一套依赖冲突解决策略来处理这种情况,它根据以下几个原则选择一个版本:
-
最短路径优先原则:Maven会选择离项目最近的依赖项路径中的版本。也就是说,如果项目直接依赖于一个版本,而间接依赖于另一个版本,那么直接依赖的版本将被选择。
-
第一声明优先原则:如果两个依赖项具有相同的路径长度,那么首次声明的版本将被选择(按照pom的依赖申明顺序)。
-
显式声明优先原则:如果两个依赖项具有相同的路径长度和首次声明顺序,那么Maven会选择在项目pom.xml文件中显式声明的版本。
4.7.2IDEA自带依赖分析工具
IDEA可以通过依赖分析工具,查询指定依赖的上级以及下级依赖,如此可以排除一些版本冲突。
4.7.2IDEA插件市场搜索分析插件
IDEA还可以从插件市场下载分析插件,点击Files->Settings->plugins,搜索“maven helper”
5.多模块继承与聚合
5.1多模块继承
在Maven中,继承指的是使用父项目定义的配置信息来为子项目提供默认的配置。这种继承关系可以帮助开发者减少重复的配置,并确保子项目与父项目保持一致的构建方式。maven子模块可以继承的有以下内容。
- 配置
- 依赖声明
- 插件声明
5.2多模块聚合
在Maven中,聚合(aggregation)是一种将多个相关的项目组合在一起管理的方式。通过聚合,可以将多个项目作为一个整体来构建、测试和部署,简化了多项目管理的复杂度。
要实现项目的聚合,需要创建一个父项目(也称为聚合项目),并在父项目的pom.xml中声明子项目。父项目可以是一个普通的Maven项目,其packaging类型可以是pom,jar,war或其他类型。
例如jforgame的配置。在根目录下执行mvn package install命令的时候,会递归把所有子模块都打包安装到本地maven仓库,非常方便。例如jforgame的parent模块。
<modules>
<module>jforgame-hotswap</module>
<module>jforgame-commons</module>
<module>jforgame-orm</module>
<module>jforgame-demo</module>
<module>jforgame-codec-parent</module>
<module>jforgame-socket-parent</module>
</modules>
详情可参考--> Maven模块化最佳实践