Maven相关知识总结

时间:2023-03-08 19:40:02

认识Maven

Maven相关知识总结

Maven是Apache软件基金会组织维护的一款自动化构建工具, 专注于Java平台工程的项目构建和依赖管理:

1:项目构建

构建不是创建,创建一个工程并不等于构建一个项目,用Maven可以管理项目开发的整个生命周期

2:依赖管理

管理项目依赖的所有jar文件,Maven项目依赖于一个库,而这个库又依赖其他库,只需要加上直接依赖的库,间接依赖的库也会加入到项目中

Maven相关知识总结

假设上图,引入spring-mvc后,spring-mvc依赖的spring-core等库也会加入到项目里面

Maven下载安装

Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装JDK,下载安装只需要把下载的文件解压到指定目录,然后配置环境变量即可:

1:准备依赖的JDK

2:下载安装

3:配置环境变量

4:测试是否安装成功

环境变量配置:

Maven相关知识总结

新建系统变量MAVEN_HOME,设置变量值为解压后的maven目录

Maven相关知识总结

在path环境变量下新增%MAVEN_HOME%\bin

Maven相关知识总结

打开cmd输入mvn -v验证是否配置成功

Maven能用来做什么

1:添加第三方的jar

2:管理jar包之间的依赖关系

3:获取第三方jar包

4:将项目拆分成多个工程模块

如果不使用maven,需要去各个框架网站上下载对应的包,然后引入到项目中,遇到依赖冲突还需要自己去逐一排查

简单示例:

1:archetype:generate(交互模式)

使用mvn archetype:generate命令,需要手动去输入项目相关的信息

Maven相关知识总结

2:archetype:generate(非交互模式)

mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false

不需要手动输入信息,自动创建项目

3:通过IDE创建Maven项目

Maven核心概念

开发目录

约定配置:

Maven提倡使用一个共同的标准目录结构,准守约定大于配置的原则

Maven相关知识总结

坐标和仓库

1:坐标

空间中的三维坐标,物理地址等都可以理解为坐标

Maven构建的唯一标识符:groupId、artifactId、version

2:仓库

本地仓库:运行Maven时,需要的任何构件都是直接从本地仓库获取

远程仓库;*仓库;私服其他第三方库

Maven相关知识总结

首先,Maven会通过坐标定位到本地仓库中的jar,如果本地仓库没有找到,就会去私服寻找,最后才会到*仓库

3:仓库依赖顺序

本地仓库 – 私服 – *仓库

POM文件

POM(project object model,项目对象模型)是Maven工程的基本工作单元,是一个XML文件,包含了项目的基本信息,用来描述项目如何构建,声明项目的依赖等

POM配置:

1:项目依赖

2:插件

3:执行目标

4:项目构建profile

5:项目版本

6:项目开发者列表

7:相关邮件列表信息

执行任务或者目标的时候:

1:Maven会在当前目录中查找POM

2:读取POM,获取所需要的配置信息,然后执行目标

POM文件内容

下面简要介绍下POM文件内容:

POM文件项目基础信息:

    <!--项目的全球唯一标识符-->
<groupId>asia.banseon</groupId>
<!-- 构件的标识符-->
<artifactId>banseon-maven2</artifactId>
<!--项目产生的构件类型,例如jar、war、ear、pom-->
<packaging>jar</packaging>
<!--项目当前版本,格式为:主版本.次版本.增量版本-限定版本号-->
<version>1.0-SNAPSHOT</version>
<!--项目的名称, Maven产生的文档用-->
<name>banseon-maven</name>
<!--父项目-->
<parent>
<!--被继承的父项目的构件标识符-->
<artifactId/>
<!--被继承的父项目的全球唯一标识符-->
<groupId/>
<!--被继承的父项目的版本-->
<version/>
</parent>

maven中的仓库分为两种,snapshot快照仓库和release发布仓库。snapshot快照仓库用于保存开发过程中的不稳定版本,release正式仓库则是用来保存稳定的发行版本

snapshot会不停的deploy,其他系统或者个人使用的时候回自动加载最新的版本

POM文件插件信息:

<build>
<!-- 可使用的插件列表 -->
<plugins>
<!--plugin元素包含描述插件所需要的信息。 -->
<plugin>
<!--插件定位坐标三元素:groupId + artifactId + version --
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.1</version>
<executions>
<execution>
</execution>
</executions>
</plugin>
</plugins>
</build>

POM文件依赖信息:

<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
<type></type>
<optional></optional>
<exclusions>
<exclusion>
</exclusion>
</exclusions>
</dependency>
</dependencies>

Maven依赖管理

多模块项目(包含成千上百个模块或者子模块),模块之间的依赖关系非常复杂,管理起来也很困难,针对这个问题,Maven提供了一个核心特性:依赖管理

依赖管理主要有两个部分:

1:依赖传递性

2:依赖范围

传递依赖:

一种情况下比如:A依赖B库,C依赖A,那么C项目也需要使用B库

Maven通过读取POM文件,找出项目之间的依赖关系,我们只需要在每个项目中定义好直接的依赖关系,其他的依赖关系,Maven会自动完成

依赖冲突

依赖冲突造成的原因:依赖传递造成的

解决依赖冲突

Maven相关知识总结

依赖范围:

传递依赖发现可以通过使用如下的依赖范围来得到限制:

Maven相关知识总结

构建生命周期

1:构建生命周期

Maven构建生命周期定义了一个项目构建和发布的过程

2:Maven生命周期工作原理

生命周期中各个步骤的工作是插件(plugin)来负责完成的。

一个插件通常完成一个或多个步骤的工作,每个步骤的工作对应插件的一个目标(goal)。不同的插件结 合起来,就可以完成整个项目的构建,例如:编译插件,compiler;测试插件,surefire;打包插件,jar; 安装插件,install;部署插件,deploy

三类生命周期

Maven标准的生命周期 :

1:Default Lifecycle:构建部署项目

2:Clean Lifecycle:清理项目

3: Site Lifecycle:生成项目站点

项目构建的步骤

Maven相关知识总结

Maven项目构建阶段

验证:验证项目是否正确且所有必须信息是可用的

编译:将Java源程序编译为字节码(.class)文件

测试:对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性

打包:将一个工程封装为一个压缩文件用于安装或部署

检查:对集成测试的结果进行检查,以保证质量达标

安装:特指Maven环境下将打包的结果——jar包或war包安装到本地仓库中 部署: 将打包的结果部署到远程仓库或将war包部署到运行服务器上运行 Maven可以自动实现上叙过程的所有操作

周期阶段

Clean 清理项目周期阶段

pre-clean:执行一些需要在clean之前完成的工作

clean:移除所有上一次构建生成的文件

post-clean:执行一些需要在clean之后立刻完成的工作

Site 生命周期阶段

pre-site:执行一些需要在生成站点文档之前完成的工作

site:生成项目的站点文档

post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备

site-deploy:将生成的站点文档部署到特定的服务器上

构建多模块系统

Maven相关知识总结

现在需要将上面三个部分拆分复用该怎么办?

Maven相关知识总结

聚合

基本概念:Maven聚合是为了能够使用一条命令就能构建多个模块

聚合模块的打包方式必须为pom,否则无法完成构建

    <modelVersion>4.0.0</modelVersion>
<groupId>com.dragon</groupId>
<artifactId>flowable</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>flowable-api</module>
<module>flowable-core</module>
<module>flowable-manager</module>
<module>flowable-server</module>
<module>flowable-parent</module>
</modules>

继承

继承是为了消除重复,我们把很多相同的配置提取出来,例如:groupId,version等

父模块的打包方式必须为pom,否则无法构建项目

父模块:

   <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent>
<packaging>pom</packaging>
<version>1.0</version>

子模块:

 <parent>
<groupId>com.dragon</groupId>
<artifactId>flowable-parent</artifactId>
<version>1.0</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>flowable-api</artifactId>
<version>1.0-SNAPSHOT</version>

聚合与继承

一:聚合和继承的关系

1:聚合模块知道它聚合了哪些模块,但是被聚合的模块不知道聚合模块的存在

2:父模块不知道子模块的存在,但是子模块都必须知道自己的父模块是谁

二:聚合和继承的作用

通过Maven的聚合与继承特性,可以更加方便的管理和构建项目了