Maven相关知识总结


目录

  • 认识Maven
  • Maven下载安装
  • Maven能用来做什么
  • Maven核心概念
    • 开发目录
    • 坐标和仓库
  • POM文件
    • POM文件内容
  • Maven依赖管理
  • 构建生命周期
  • 构建多模块系统
    • 聚合
    • 继承
    • 聚合与继承


认识Maven

Maven相关知识总结_Maven
Maven是Apache软件基金会组织维护的一款自动化构建工具, 专注于Java平台工程的项目构建和依赖管理:
1:项目构建
构建不是创建,创建一个工程并不等于构建一个项目,用Maven可以管理项目开发的整个生命周期
2:依赖管理
管理项目依赖的所有jar文件,Maven项目依赖于一个库,而这个库又依赖其他库,只需要加上直接依赖的库,间接依赖的库也会加入到项目中
Maven相关知识总结_Maven_02
假设上图,引入spring-mvc后,spring-mvc依赖的spring-core等库也会加入到项目里面

Maven下载安装

Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装JDK,下载安装只需要把下载的文件解压到指定目录,然后配置环境变量即可:
1:准备依赖的JDK
2:下载安装
3:配置环境变量
4:测试是否安装成功
环境变量配置:
Maven相关知识总结_Maven_03
新建系统变量MAVEN_HOME,设置变量值为解压后的maven目录
Maven相关知识总结_Maven_04
在path环境变量下新增%MAVEN_HOME%\bin
Maven相关知识总结_Maven_05
打开cmd输入mvn -v验证是否配置成功

Maven能用来做什么

1:添加第三方的jar
2:管理jar包之间的依赖关系
3:获取第三方jar包
4:将项目拆分成多个工程模块
如果不使用maven,需要去各个框架网站上下载对应的包,然后引入到项目中,遇到依赖冲突还需要自己去逐一排查
简单示例:
1:archetype:generate(交互模式)
使用mvn archetype:generate命令,需要手动去输入项目相关的信息
Maven相关知识总结_Maven_06
2:archetype:generate(非交互模式)

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

不需要手动输入信息,自动创建项目
3:通过IDE创建Maven项目

Maven核心概念

开发目录

约定配置:
Maven提倡使用一个共同的标准目录结构,准守约定大于配置的原则
Maven相关知识总结_Maven_07

坐标和仓库

1:坐标
空间中的三维坐标,物理地址等都可以理解为坐标
Maven构建的唯一标识符:groupId、artifactId、version
2:仓库
本地仓库:运行Maven时,需要的任何构件都是直接从本地仓库获取
远程仓库;中央仓库;私服其他第三方库
Maven相关知识总结_Maven_08
首先,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_09
依赖范围:
传递依赖发现可以通过使用如下的依赖范围来得到限制:
Maven相关知识总结_Maven_10

构建生命周期

1:构建生命周期
Maven构建生命周期定义了一个项目构建和发布的过程
2:Maven生命周期工作原理
生命周期中各个步骤的工作是插件(plugin)来负责完成的。
一个插件通常完成一个或多个步骤的工作,每个步骤的工作对应插件的一个目标(goal)。不同的插件结 合起来,就可以完成整个项目的构建,例如:编译插件,compiler;测试插件,surefire;打包插件,jar; 安装插件,install;部署插件,deploy
三类生命周期
Maven标准的生命周期 :
1:Default Lifecycle:构建部署项目
2:Clean Lifecycle:清理项目
3: Site Lifecycle:生成项目站点
项目构建的步骤
Maven相关知识总结_Maven_11
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_12
现在需要将上面三个部分拆分复用该怎么办?
Maven相关知识总结_Maven_13

聚合

基本概念: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的聚合与继承特性,可以更加方便的管理和构建项目了