Maven教程

一、Maven简介

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

image-20240606230256948

1.1 Maven是什么

1
2
3
Maven的本质就是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)

POM(Project Object Model): 项目对象模型

1.2 Maven的作用

1
2
3
1.项目构建: 提供标准的、管平台的自动化项目构建方式
2.依赖管理: 方便快捷的管理项目依赖的资源(Jar包),避免资源间的版本冲突问题
3.同一开发结构: 提供标准的、统一的项目结构

image-20240606230506863

二、下载与安装

下载地址

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/

image-20240606231958580

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文件

image-20240606234810306

配置的内容:

1
<localRepository>本地仓库的位置</localRepository>

image-20240606235058709

4.2 配置镜像仓库

什么是镜像仓库:

1
镜像仓库即某个仓库的镜像,镜像仓库中的内容与被镜像仓库中的资源一样

Maven默认配置的远程仓库:

image-20240606235842414

为什么需要配置镜像仓库:

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/

在什么地方配置远程仓库:

image-20240606234810306

配置的内容:

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>

image-20240607001207401

配置内容说明:

image-20240607001404120

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

image-20240612203132195

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

image-20240612203538568

5.3 构建命令

注:下面的命令须在pom文件所在的目录执行。一次可以执行多个命令,使用空格分隔

编译

1
mvn compile

清理

1
mvn clean

测试

1
mvn test

打包

1
mvn package

安装到本地仓库

1
mvn install

六、 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

第一步

image-20240612204104087

第二步

image-20240612204507833

7.1 创建普通工程

image-20240612204812150

7.2 创建Web工程

image-20240612204853648

八、依赖管理

8.1 依赖配置

1
依赖指当前项目运行所需要的Jar,一个项目可以设置多个依赖

依赖管理的格式

1
2
3
4
5
6
7
8
9
10
11
12
<!-- 当前项目所依赖的所有Jar -->
<dependencies>
<!-- 设置具体的依赖 -->
<dependency>
<!-- 依赖所属群组Id -->
<groupId>xxxx</groupId>
<!-- 依赖所属项目Id -->
<artifactId>xxxx</artifactId>
<!-- 依赖版本号 -->
<version>xxxx</version>
</dependency>
</dependencies>

8.2 依赖传递

1
2
3
依赖具有传递性
直接依赖: 在当前项目中通过依赖配置建立的依赖关系
间接依赖: 被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源

image-20240612211424386

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

image-20240612212047266

8.3 可选依赖

1
可选依赖指对外(依赖当前项目的项目)隐藏当前项目所依赖的资源---不透明
1
2
3
4
5
6
7
8
9
10
11
<!-- 设置具体的依赖 -->
<dependency>
<!-- 依赖所属群组Id -->
<groupId>xxxx</groupId>
<!-- 依赖所属项目Id -->
<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>
<!-- 依赖所属群组Id -->
<groupId>xxxx</groupId>
<!-- 依赖所属项目Id -->
<artifactId>xxxx</artifactId>
<!-- 依赖版本号 -->
<version>xxxx</version>
<!-- 配置排除依赖 -->
<exclusions>
<exclusion>
<!-- 依赖所属群组Id -->
<groupId>xxxx</groupId>
<!-- 依赖所属项目Id -->
<artifactId>xxxx</artifactId>
</exclusion>
</exclusions>
</dependency>

8.5 依赖范围

1
2
3
4
5
6
依赖的Jar默认情况下可以在任何地方使用,可以通过scope标签设定其作用范围。

作用范围:
主程序范围有效(maint文件夹范围内)
测试程序范围有效(test文件夹范围内)
是否参与打包 (package指令范围内)

image-20240612213718960

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

image-20240612214454677

九、生命周期与插件

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>