一、Maven简介
1 2 3 4
| 传统项目管理存在的问题: 1.Jar包不统一、Jar包不兼容 2.工程升级维护过程操作繁琐 由于传统项目存在以上问题,因此产生的Maven这个工具,用于对项目的依赖进行管理,以及管理项目的构建、编译、测试、打包、安装、发布等过程(注: 项目的构建过程依赖于Maven的插件,通过插件可在Maven的的构建生命周期的不同时间段进行某些操作)
|

1.1 Maven是什么
1 2 3
| Maven的本质就是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
POM(Project Object Model): 项目对象模型
|
1.2 Maven的作用
1 2 3
| 1.项目构建: 提供标准的、管平台的自动化项目构建方式 2.依赖管理: 方便快捷的管理项目依赖的资源(Jar包),避免资源间的版本冲突问题 3.同一开发结构: 提供标准的、统一的项目结构
|

二、下载与安装
下载地址:
1
| 官网: https://maven.apache.org/
|
安装过程:
1 2 3 4 5 6 7 8
| 1.在官网下载Maven的压缩包 2.解压压缩包 3.配置环境变量: JAVA_HOME MAVEN_HOME PATH 4.测试安装成功 mvn -v
|
三、Maven的基础概念
3.1 仓库
1 2 3 4 5 6 7 8 9 10 11
| 仓库: 用于存储资源,包含各种Jar包
仓库分类: 本地仓库: 自己电脑中存放资源的仓库,连接远程仓库获取资源 远程仓库: 非本机电脑上的仓库,为本地仓库提供资源 中央仓库: Maven团队维护,存储了几乎所有开源的资源的仓库 私服: 部门/公司范围内存储资源的仓库,从中央仓库获取资源 私服的作用: 1.保存具有版权的资源,包含购买或自主研发的Jar 2.一定范围内共享资源,仅对内部开放,不对外共享 中央仓库的地址: https://mvnrepository.com/
|

3.2 坐标
1 2 3 4 5 6 7 8 9
| 什么是坐标: 坐标即用于描述仓库中资源的位置的一段信息
一个坐标主要包括以下几个部分: groupId : 定义当前Maven项目隶属组织名称(通常是域名反写,例如: com.chenhao) artifactId : 定义当前Maven项目名称(通常是模块名称,例如: CRM、SMS) version : 定义当前项目的版本 Maven坐标的作用: 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交给机器完成
|
四、配置Maven
4.1 配置本地仓库
为什么需要配置本地仓库:
1
| 由于Maven的本地仓库的位置是在当前用户目录下的.m2目录下的repository文件夹下,由于存在在C盘,而C盘一般作为系统盘,后期随着Maven的不断使用,本地仓库中会越来越大,因此通常会修改Maven的本地仓库。
|
在什么地方配置本地仓库:
1
| Maven的安装目录下的conf文件夹下的settings文件
|

配置的内容:
1
| <localRepository>本地仓库的位置</localRepository>
|

4.2 配置镜像仓库
什么是镜像仓库:
1
| 镜像仓库即某个仓库的镜像,镜像仓库中的内容与被镜像仓库中的资源一样
|
Maven默认配置的远程仓库:

为什么需要配置镜像仓库:
1 2
| 由于Maven默认连接的远程仓库位置为国外的服务器,因此下载资源时速度比较慢,因此一般会配置一个镜像仓库来提高下载速度和稳定性。 配置镜像仓库即告诉Maven,以后下载资源时直接访问配置的镜像仓库下载,不要直接去中央仓库下载
|
常用的镜像仓库:
1 2 3 4
| 阿里云maven仓库:https://maven.aliyun.com/repository/public 华为云maven仓库:https://mirrors.huaweicloud.com/repository/maven/ 腾讯云maven仓库:https://mirrors.cloud.tencent.com/nexus/repository/maven-public/ 网易云maven仓库:http://maven.netease.com/nexus/content/groups/public/
|
在什么地方配置远程仓库:

配置的内容:
1 2 3 4 5 6
| <mirror> <id>aliyun-public</id> <mirrorOf>*</mirrorOf> <name>aliyun public</name> <url>https://maven.aliyun.com/repository/public</url> </mirror>
|

配置内容说明:

4.3 全局setting与用户setting
1 2 3 4
| 全局setting: 它对整个系统是有效的 用户setting: 只对当前用户有效
注意: 用户范围的settings.xml会覆盖全局的settings.xml
|
setting.xml文件中的配置详细介绍可访问下面的超链接进行观看
1
| https://www.cnblogs.com/DreamDrive/p/5571916.html
|
4.3.1 全局setting
存放位置
1
| Maven的安装目录/conf/setting.xml
|
4.3.2 用户setting
存放位置
1
| ${user_home}/.m2/settings.xml
|
五、手动制作Maven项目
5.1 Maven的普通工程目录结构
1 2 3 4 5 6 7 8 9 10
| project java-project src main java resources test java resources pom.xml
|

5.2 Maven的Web工程目录结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| project web-project src main java resources webapp WEB-INF web.xml index.jsp test java resources pom.xml
|

5.3 构建命令
注:下面的命令须在pom文件所在的目录执行。一次可以执行多个命令,使用空格分隔
编译
清理
测试
打包
安装到本地仓库
六、 Maven插件构建项目
6.1 创建普通工程
1 2 3 4 5 6
| mvn archetype:generate -DarchetypeArtifactId=maven-archetype-quickstart -DgroupId={project-packaging} -DartifactId={project-name} -Dversion={version} -DinteractiveMode=false
|
6.2 创建Web工程
1 2 3 4 5 6
| mvn archetype:generate -DarchetypeArtifactId=maven-archetype-webapp -DgroupId={project-packaging} -DartifactId={project-name} -Dversion={version} -DinteractiveMode=false
|
七、IDEA生成Maven项目
7.1 IDEA中集成Maven
第一步

第二步

7.1 创建普通工程

7.2 创建Web工程

八、依赖管理
8.1 依赖配置
1
| 依赖指当前项目运行所需要的Jar,一个项目可以设置多个依赖
|
依赖管理的格式
1 2 3 4 5 6 7 8 9 10 11 12
| <dependencies> <dependency> <groupId>xxxx</groupId> <artifactId>xxxx</artifactId> <version>xxxx</version> </dependency> </dependencies>
|
8.2 依赖传递
1 2 3
| 依赖具有传递性 直接依赖: 在当前项目中通过依赖配置建立的依赖关系 间接依赖: 被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源
|

1 2 3 4
| 依赖传递的冲突问题: 路径优先: 当依赖中出现相同资源时,层级越深,优先级越低,层级越浅,优先级越高 声明优先: 当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的 特殊优先: 当同级配置了相同资源的不同版本,后配置的覆盖先配置的
|

8.3 可选依赖
1
| 可选依赖指对外(依赖当前项目的项目)隐藏当前项目所依赖的资源---不透明
|
1 2 3 4 5 6 7 8 9 10 11
| <dependency> <groupId>xxxx</groupId> <artifactId>xxxx</artifactId> <version>xxxx</version> <optional>true</optional> </dependency>
|
8.4 排除依赖
1
| 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本---不需要
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <dependency> <groupId>xxxx</groupId> <artifactId>xxxx</artifactId> <version>xxxx</version> <exclusions> <exclusion> <groupId>xxxx</groupId> <artifactId>xxxx</artifactId> </exclusion> </exclusions> </dependency>
|
8.5 依赖范围
1 2 3 4 5 6
| 依赖的Jar默认情况下可以在任何地方使用,可以通过scope标签设定其作用范围。
作用范围: 主程序范围有效(maint文件夹范围内) 测试程序范围有效(test文件夹范围内) 是否参与打包 (package指令范围内)
|

1 2
| 依赖范围的传递性: 带有依赖范围的资源在进行传递时,作用范围将受到影响
|

九、生命周期与插件
9.1 构建生命周期
1 2 3 4
| Maven对项目构建的生命周期划分为3套 clean: 清理工作 default: 核心工作,例如编译、测试、打包、部署等 site: 产生报告、发布站点等
|
9.2 插件
1 2 3
| 插件与生命周期内的阶段进行绑定,在执行到对应生命周期时,会执行对应插件功能。 默认Maven在各个生命周期上绑定有预设的功能 可以通过插件自定义其他功能
|
插件的配置格式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <build> <plugins> <plugin> <groupId>xxxx</groupId> <artifactId>xxxx</artifactId> <version>xxxx</version> <executions> <phase>绑定的生命周期的阶段</phase> </executions> </plugin> </plugins> </build>
|
9.2.1 配置Tomcat插件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <version>2.1</version> <configuration> <port>80</port> <path>/</path> </configuration> </plugin> </plugins> </build>
|