一、为什么使用Maven
构建一个项目需要用到很多第三方的类库(jar包),一个项目,jar包之多,jar包之间关系错综复杂(一个Jar包往往又会引用其他Jar包)
二、Maven的作用
什么是依赖:
若A工程里面用到了B工程的类、接口、配置文件等资源,即:A依赖B

1、依赖管理(管理jar包):
①jar包的规模:
如:使用SpringBoot框架中的三个功能,对应写Maven配置,引入三个依赖,maven会帮我们最终导入上 百个jar包。
②jar包的来源
maven会自动下载,不需要我们去网上搜索
③jar包之间的依赖关系
自动关联下载jar包中所有依赖的其他jar包,而且不会冲突。
2、构建管理工具:
标准化的构建流程:
如:javaweb项目想要跑起来,要编译,打成war包,到服务器(tomcat)去部署。
这些操作,本地开发的话,IDE环境(IDEA)可以帮助我们去完成,到了服务器层,maven可以帮我们构建。

3、小结:
maven是一个基于java平台的自动化构建工具 。是 Apache 下的一个纯 Java 开发的开源项目。
目的:管理和构建java项目。
三、maven项目的目录结构
若要使用Maven,那么项目的目录结构必须符合 Maven 的规范。即:maven提供了标准化的目录结构。


【备注】:
目录结构 是在超级POM中去配置的,超级POM是所有POM的父POM;
超级POM + 自己定义的POM = 有效POM
四、maven仓库
Maven仓库用来存放Maven管理的所有Jar包。

**1、本地仓库:**在本地pc的仓库,里面是一个个的文件夹;
2、中央仓库: 由maven团队维护,全球唯一,maven下载jar包,默认访问境外的中央仓库,速度很慢。里面存放的都是开源,免费的jar包;
3、中央仓库镜像: 对中央仓库的分流作用,减轻中央仓库的压力(推荐:阿里云提供的镜像仓库)
**4、私服nexus:**一般由公司团队搭建的私有仓库,一个公司,可以建立一个私服(它是架设在局域网内的仓库服务)。
私服代理广域网上的远程仓库,供局域网内的Maven用户使用。
当Maven需要下载构件的时候,它从私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为Maven的下载请求提供服务。

jar包引入项目的顺序:
通常下载一个jar包,先在本地仓库下载,如果本地仓库中不存在,则去私服中寻找,如果私服中也不存在,则再联网到中央仓库(镜像)去下载:
本地仓库------》私服nexus------》中央仓库镜像
五、maven的安装、配置

注意:解压放置的目录要求:非中文,没有空格!!!
【备注------配置环境变量的规则】:
XXX_HOME:通常指向的是bin目录的上一级;
PATH:通常指向的是bin目录。
5-1、Maven核心程序的下载和解压、环境变量的配置
maven官网:Welcome to Apache Maven -- Maven


推荐操作参考文档:
成功验证:mvn -v

本地仓库即随意一个空文件夹即可,因为默认是放C盘,所以,还是建议修改本地仓库

【注意】:
本地仓库本身要使用非中文,没有空格的目录。
5-2、maven目录介绍

- bin目录: 该目录包含了mvn运行的脚本,这些脚本用来配置java命令,准备好classpath和相关的Java系统属性,然后执行Java命令。
比如:which mvn 查看maven安装的本地位置。
- boot目录 : 该目录只包含一个文件,该文件为plexus-classworlds-2.5.2.jar。plexus-classworlds是一个类加载器框架,相对于默认的java类加载器,它提供了更加丰富的语法以方便配置,Maven使用该框架加载自己的类库。
- conf目录: 该目录包含了一个非常重要的文件settings.xml。直接修改该文件,就能在机器上全局地定制Maven的行为,一般情况下,我们更偏向于复制该文件至~/.m2/目录下(~表示用户目录),然后修改该文件,在用户范围定制Maven的行为。
- lib目录: 该目录包含了所有Maven运行时需要的Java类库,Maven本身是分模块开发的,因此用户能看到诸如maven-core-3.0.jar、maven-model-3.0.jar之类的文件,此外这里还包含一些Maven用到的第三方依赖如commons-cli-1.2.jar、commons-lang-2.6.jar等等。
5-3、maven本地仓库的配置

【备注】:
随着项目的jar包的应用增多,本地仓库体积会变得越来越大,影响系统的性能,所以:建议将本地仓库另外指定位置。

5-4、maven镜像仓库的配置
如果仓库X可以提供仓库Y存储的所有内容,那么就可以认为X是Y的一个镜像。
推荐国内的阿里云镜像:
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<mirrorOf>central</mirrorOf>
</mirror>
六、maven的常用命令
运行maven命令,首先在项目的pom.xml文件所在的文件夹下打开dos窗口!

构建的每一步,都会从私服中下载相关命令需要的jar包
- 清理clean: 删除target文件夹。即:删除编译的结果,为重新编译做准备。
- **编译compile:**java--->class;(生成target下的字节码文件xxx.class)
**主程序编译结果存放目录:**target/class
**测试程序编译结果存放目录:**target/test-class
- **测试test:**运行提前准备好的测试程序(Junit),即test文件夹中的测试文件
- 打包package:
- java工程--->jar包
- web工程--->war包
【注意】打成的jar包的名字:
由当前模块的坐标信息组成!
jar包里面只有主题程序的字节码文件,没有测试程序的字节码文件。
- 安装install: 将打成的jar、war包,放到,本地仓库,供其他项目去使用。(存放路径是根据它的坐标生成的 )
- 部署:
- 部署jar包:把jar包部署到Nexus私服服务器上
- 部署war包:借助相关的maven插件(如:cargo),将war包部署到tomcat服务器上。
上面的命令大部分都是连写的,大家也可以拆分分别执行,看个人喜好。
- mvn clean:表示运行清理操作(会默认把target文件夹中的数据清理)。
- mvn clean compile:表示先运行清理之后运行编译,会将代码编译到target文件夹中。
- mvn clean test:运行清理和测试。
- mvn clean package:运行清理和打包。
- mvn clean install:运行清理和安装,会将打好的包安装到本地仓库中,以便其他的项目可以调用。
- mvn clean deploy:运行清理和发布(发布到私服上面)。
七、maven生命周期

执行install命令,会先compile,生成class文件,在执行test里面的测试代码,在package成jar包,最后install到本地仓库。
八、maven的坐标
8-1、坐标的定义
在Maven中,坐标是Jar包的唯一标识,Maven通过坐标(三个向量)在maven仓库中找到项目所需的Jar包。(类似数学中的X、Y、Z轴)
- groupId:公司/组织域名的倒序,通常也会加上项目的名称;
- artifactId:项目中一个模块的名称;
- version:模块的版本号;
【备注1】:
这三个向量的范围,由大到小。
【备注2------项目 VS 工程】:
一个公司的项目(立项)里有多个工程(模块)------分布式架构

8-2、坐标和仓库中jar包的存储路径之间的对应关系

上面的坐标对应的jar包在本地仓库中的路径:

九、idea配置maven
9-1、idea配置maven环境


9-2、idea创建maven项目


9-3、idea导入maven项目

十、pom.xml文件:依赖管理
10-1、第三方jar包的导入


若是知道本地仓库有要使用的jar包,可以用如下方式直接导入

10-2、依赖范围<scope>


<scope>默认值:compile

运行环境无效的意思就是,打成的jar、war包中没有响应的依赖!
打成的jar、war包中的依赖如下图所示:
provided范围的依赖:
provided范围的依赖,开发过程中需要用到的服务器上的jar包,但是部署的时候,tomcat服务器上面已经提供了,所以,部署的时候就不用带了。
要是非要带,会有冲突!!!最典型的是:Servlet API。
不用太担心scope范围:
10-3、pom.xml的解读
<project>是根标签!

1. 项目基本信息(Project Coordinates)
项目的唯一标识符,用于在仓库中定位项目。
XML
<!--根目录-->
<project>
<!-- 自己的项目坐标 -->
<groupId>com.example</groupId> <!-- 组织或公司的唯一标识 -->
<artifactId>my-project</artifactId> <!-- 项目名称 -->
<version>1.0.0</version> <!-- 项目版本 -->
<packaging>jar</packaging> <!-- 打包方式:jar(默认)、war、pom等 -->
</project>
每一个模块都有自己的pom.xml文件,都需要在pom.xml文件中通过gav唯一定义自己要打成jar包后在本地仓库存放的位置。
2. 父项目继承(Parent POM)
如果项目继承自父项目,需指定父项目的坐标和位置。

3. 属性定义(Properties)
定义变量,简化配置复用。
XML
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
<junit.version>4.13.2</junit.version>
</properties>
在依赖中引用属性:
XML
<version>${junit.version}</version>
4. 多模块项目(Multi-Module Projects)
定义子模块,用于聚合构建。

十一、让web工程依赖java工程
【注意】:
只有web工程依赖java工程(java工程就是web工程里面导入的jar包,放在web工程的WEB-INF/lib下),没有java工程依赖web工程。
web工程,就是会在src->main下多一个webapp文件夹!
示例:
HelloWorldTime项目(web工程)依赖于HelloWord2项目(java工程)

**① install HelloWord2:**将打成的包,放到本地仓库,供其他项目去使用;
**② 将HelloWord2项目引入到HelloWorldTime项目中:**在HelloWorldTime项目中的pom.xml文件中,添加HelloWord2项目的gav。
maven2项目依赖于maven1项目,则在执行maven2项目时,必须先将maven1项目加入到本地仓库(install),之后才能执行maven2项目。
此整合方式的缺点:
若是maven2项目依赖于很多项目,则每个项目都要install,很麻烦。
解决方式:
聚合。(以上前置工程的install操作,可以交给"聚合"一次性搞定)
十二、依赖的传递性
如果A依赖B,B依赖C,那么A→B和B→C都是直接依赖,而A→C是间接依赖。
A------>B------>C
A依赖B,B依赖C,在A没有配置C的依赖的情况下,A里面能不能直接使用C?
【结论】:A里面能不能直接使用C,要看B依赖C时,使用的范围。
-
B------>C:compile范围,可以传递;
-
B------>C:test、provided范围,不能传递,此时A想使用C,需要在A的pom.xml文件里面去重新配置C的依赖关系。

【小结】:
A.jar ---> B.jar ---> C.jar
要使A.jar ---> C.jar,当且仅当B.jar依赖于C.jar的范围是compile(默认)。
十三、依赖的排除------exclusion标签
作用:阻断依赖的传递性

在A------>B时做阻断。

十四、继承 VS 聚合
14-1、继承------parent标签
Maven 继承是指一个 Maven 项目(子项目)可以继承另一个 Maven 项目(父项目)的配置信息,从而避免在多个子项目中重复定义相同的配置。
使用场景 :当多个项目有相同的依赖、插件配置、构建配置等时,使用继承可以减少重复配置,提高项目的可维护性。
例如,一个大型企业级应用可能包含多个模块,这些模块都使用相同的 Java 版本、日志框架和测试框架,此时可以创建一个父项目,将这些公共配置放在父项目中,子项目继承父项目即可。
在父工程中统一管理项目中的依赖信息,具体来说,是管理依赖信息中的版本。
如:A、B、C、D、E中都依赖了spring,为了防止冲突,可以在他们的父工程中,统一管理spring依赖的版本,也能实现一处修改,处处生效。
1、概念
A工程继承B工程
-
B工程:父工程
-
A工程:子工程
本质:A工程的pom.xml中的配置继承了B工程中pom.xml的配置。
示例:
① 父工程,工程名:jeecg-boot-parent

【注意1】:
当前工程为父工程,它要去管理子工程,所以打包方式必须是pom!!!
打包方式为pom的maven工程中不写业务代码!他是专门管理其他maven工程的工程!仅提供一个pom.xml文件
【注意2】:
父工程的pom.xml文件中,在<dependencies>中配置的依赖,都是公共依赖,子项目会继承父项目中定义的依赖,无需再次声明。
② 子工程
-
jeecg-boot-base-api
-
jeecg-boot-base-core
-
jeecg-boot-base-tools
子项目通过
<parent>
标签指定要继承的父项目。

【注意1】:
使用maven命令在父工程中创建子工程的时候,父工程的pom.xml文件中会自动创建modules标签,也是聚合的配置标签。
子工程的pom.xml文件中也会自动创建parent标签。
【注意2】:子工程的groupId、version和父工程一样,可以省略!!!
artifactId:自己模块的名字。
【注意3】:
子项目也可以添加自己特有的依赖,或者覆盖父项目中的依赖版本。
直接在子项目的pom.xml文件中使用<dependencies>中配置依赖。
14-2、聚合------<modules>标签
聚合,也称为多模块项目,主要是为了方便一次性构建多个相关的项目。父项目通过 <modules>
标签来声明要聚合的子项目,这样在执行 Maven 构建命令时,可以同时对多个子项目进行操作。
如果父项目不仅要作为配置继承的基础,还要实现多模块项目的聚合构建,就需要配置 <modules>
标签。以下是包含 <modules>
标签的父项目 pom.xml
示例:

在父项目目录下执行 Maven 构建命令时,会依次对jeecg-boot-base-core、jeecg-module-demo、jeecg-module-system进行构建。
这里的 "构建" 指的是 Maven 根据项目的 pom.xml
文件中的配置,执行一系列操作来将项目源代码转化为可部署、可运行的软件产品。
下面详细介绍构建所包含的具体内容和流程:
构建阶段概述
Maven 的构建过程由一系列的生命周期阶段(Lifecycle Phases)组成,这些阶段按照特定的顺序依次执行。
常见的 Maven 生命周期有三个:clean
、default
和 site
,其中 default
生命周期是最常用的,用于完成项目的编译、测试、打包等核心任务。
以下是 default
生命周期中一些重要阶段的说明:
具体构建操作
1. 清理阶段(clean
生命周期)
当执行 mvn clean
命令时,会触发清理阶段,该阶段的主要任务是删除项目之前构建生成的所有文件,确保后续构建是基于干净的环境进行的。
例如,删除 target
目录下的编译结果、打包文件等。
2. 编译阶段(default
生命周期)
- 编译源代码 :在
compile
阶段,Maven 会使用配置的编译器(如maven - compiler - plugin
)将项目的源代码(通常是 Java 文件)编译成字节码文件(.class
文件)。这些字节码文件会被放置在target/classes
目录下。 - 编译测试代码 :
test - compile
阶段会编译项目的测试代码,测试代码通常存放在src/test/java
目录下,编译后的测试字节码文件会被放置在target/test - classes
目录下。
3. 测试阶段(default
生命周期)
在 test
阶段,Maven 会使用测试框架(如 JUnit)执行项目的单元测试代码。测试代码会在一个隔离的环境中运行,以确保不会影响项目的正常运行。如果有测试用例失败,Maven 会输出详细的错误信息。
4. 打包阶段(default
生命周期)
- 生成可分发的包 :
package
阶段会根据项目的packaging
配置(如jar
、war
等)将编译后的字节码文件和相关资源打包成相应的文件格式。例如,如果packaging
为jar
,会生成一个 JAR 文件;如果为war
,会生成一个 WAR 文件。这些打包文件会被放置在target
目录下。
5. 安装阶段(default
生命周期)
install
阶段会将打包好的文件安装到本地 Maven 仓库中。本地仓库通常位于用户主目录下的 .m2/repository
目录。这样,其他项目就可以通过 Maven 依赖引用该项目。
6. 部署阶段(default
生命周期)
deploy
阶段会将打包好的文件部署到远程 Maven 仓库中,供团队内的其他开发者或项目使用。部署过程需要配置远程仓库的相关信息,如仓库地址、认证信息等。
多模块项目构建特点
在多模块项目中,当在父项目目录下执行 Maven 构建命令时,Maven 会按照 <modules>
标签中定义的顺序依次对每个子项目执行上述构建过程。
例如,先对 child - project - 1
执行清理、编译、测试、打包等操作,完成后再对 child - project - 2
进行相同的操作。这样可以确保各个子项目之间的依赖关系得到正确处理,并且整个项目的构建过程是有序的。
例如,在父项目目录下执行 mvn clean install
命令,会先清理所有子项目的构建结果,然后依次对每个子项目进行编译、测试、打包,并将打包好的文件安装到本地仓库。