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 命令,会先清理所有子项目的构建结果,然后依次对每个子项目进行编译、测试、打包,并将打包好的文件安装到本地仓库。

相关推荐
drebander8 小时前
Maven 构建中的安全性与合规性检查
java·maven
drebander8 小时前
Maven 与 Kubernetes 部署:构建和部署到 Kubernetes 环境中
java·kubernetes·maven
丁总学Java16 小时前
在IDEA的Maven中(同步所有Maven项目)和(重新加载所有Maven项目)的区别
java·maven·intellij-idea
灬Change17 小时前
maven 发布本地jar包到私库
linux·maven·jar
小安同学iter1 天前
使用Maven将Web应用打包并部署到Tomcat服务器运行
java·tomcat·maven
小钊(求职中)1 天前
Java开发实习面试笔试题(含答案)
java·开发语言·spring boot·spring·面试·tomcat·maven
只吹45°风2 天前
Java-如何将其他地方拉取的jar包导入本地maven环境
java·maven·jar
modi0002 天前
使用IDEA创建Maven项目、Maven坐标,以及导入Maven项目
java·maven·intellij-idea
-优势在我2 天前
android studio 使用maven-publish 插件上传aar到远程maven仓库
android·maven·android studio