Maven相关知识总结
认识Maven
Maven是Apache软件基金会组织维护的一款自动化构建工具, 专注于Java平台工程的项目构建和依赖管理:
1:项目构建
构建不是创建,创建一个工程并不等于构建一个项目,用Maven可以管理项目开发的整个生命周期
2:依赖管理
管理项目依赖的所有jar文件,Maven项目依赖于一个库,而这个库又依赖其他库,只需要加上直接依赖的库,间接依赖的库也会加入到项目中
假设上图,引入spring-mvc后,spring-mvc依赖的spring-core等库也会加入到项目里面
Maven下载安装
Maven 是一个基于 Java 的工具,所以要做的第一件事情就是安装JDK,下载安装只需要把下载的文件解压到指定目录,然后配置环境变量即可:
1:准备依赖的JDK
2:下载安装
3:配置环境变量
4:测试是否安装成功
环境变量配置:
新建系统变量MAVEN_HOME,设置变量值为解压后的maven目录
在path环境变量下新增%MAVEN_HOME%\bin
打开cmd输入mvn -v验证是否配置成功
Maven能用来做什么
1:添加第三方的jar
2:管理jar包之间的依赖关系
3:获取第三方jar包
4:将项目拆分成多个工程模块
如果不使用maven,需要去各个框架网站上下载对应的包,然后引入到项目中,遇到依赖冲突还需要自己去逐一排查
简单示例:
1:archetype:generate(交互模式)
使用mvn archetype:generate命令,需要手动去输入项目相关的信息
2:archetype:generate(非交互模式)
mvn archetype:generate -DgroupId=com.companyname.bank -DartifactId=consumerBanking -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
不需要手动输入信息,自动创建项目
3:通过IDE创建Maven项目
Maven核心概念
开发目录
约定配置:
Maven提倡使用一个共同的标准目录结构,准守约定大于配置的原则
坐标和仓库
1:坐标
空间中的三维坐标,物理地址等都可以理解为坐标
Maven构建的唯一标识符:groupId、artifactId、version
2:仓库
本地仓库:运行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会自动完成
依赖冲突
依赖冲突造成的原因:依赖传递造成的
解决依赖冲突
依赖范围:
传递依赖发现可以通过使用如下的依赖范围来得到限制:
构建生命周期
1:构建生命周期
Maven构建生命周期定义了一个项目构建和发布的过程
2:Maven生命周期工作原理
生命周期中各个步骤的工作是插件(plugin)来负责完成的。
一个插件通常完成一个或多个步骤的工作,每个步骤的工作对应插件的一个目标(goal)。不同的插件结 合起来,就可以完成整个项目的构建,例如:编译插件,compiler;测试插件,surefire;打包插件,jar; 安装插件,install;部署插件,deploy
三类生命周期
Maven标准的生命周期 :
1:Default Lifecycle:构建部署项目
2:Clean Lifecycle:清理项目
3: Site Lifecycle:生成项目站点
项目构建的步骤
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聚合是为了能够使用一条命令就能构建多个模块
聚合模块的打包方式必须为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的聚合与继承特性,可以更加方便的管理和构建项目了