Maven教程

一、为什么使用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

推荐操作参考文档:

https://juejin.cn/post/6844903543711907848

成功验证: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 生命周期有三个:cleandefaultsite,其中 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 配置(如 jarwar 等)将编译后的字节码文件和相关资源打包成相应的文件格式。例如,如果 packagingjar,会生成一个 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 命令,会先清理所有子项目的构建结果,然后依次对每个子项目进行编译、测试、打包,并将打包好的文件安装到本地仓库。

相关推荐
阿宁又菜又爱玩18 分钟前
Maven基础知识
java·maven
冷雨夜中漫步30 分钟前
Maven BOM(Bill of Materials)使用指南与常见错误
java·数据库·maven
BUTCHER535 分钟前
maven插件
java·maven
Hui Baby2 小时前
maven自动构建到镜像仓库
java·maven
永不停歇的蜗牛17 小时前
Maven的POM文件相关标签作用
服务器·前端·maven
洛克大航海1 天前
Maven 的下载安装配置教程
java·maven
Mr.朱鹏1 天前
RocketMQ可视化监控与管理
java·spring boot·spring·spring cloud·maven·intellij-idea·rocketmq
咖啡不甜不好喝1 天前
IDEA Maven设置所有项目生效
maven·idea
0和1的舞者1 天前
《Maven 核心功能与仓库体系详解》
ide·maven·项目管理·仓库·依赖
q***06291 天前
(CICD)自动化构建打包、部署(Jenkins + maven+ gitlab+tomcat)
自动化·jenkins·maven