Maven
apache旗下的一个开源项目,一款用于管理和构建java项目的工具
什么是Maven
一个项目管理和构建工具,基于项目对象模型(POM)的概念,通过一小段描述信息来管理项目的构建,报告和文档.
Maven的作用
依赖管理
方便快捷的管理项目依赖的资源jar包,避免版本冲突问题
统一项目结构
提供标准,统一的项目结构.
无论什么编译环境,都可以自动生成一个统一标准的项目目录结构.
项目构建
基于项目对象模型(POM)
提供了标准的,跨平台的自动化项目构建方式
提供了一套简单的命令来完成项目构建.
Maven模型
项目管理模型
依赖管理模型
插件
这部分提供插件完成了标准化的构建流程.
这部分将项目抽象成了一个对象模型
依赖管理模型使用对象模型的坐标来描述项目依赖于哪些第三方jar包
Maven仓库
依赖jar包的存储位置,项目运行时从本地仓库中拿取jar包
仓库的分类
本地仓库:
自己计算机上的一个目录
远程仓库(私服):
一般由公司团队搭建的私有仓库
当项目中使用坐标引入对应依赖jar包后
会先查找本地仓库是否有对应jar包
如果有:直接引用
如果没有:去中央仓库下载对应jar包到本地
还可以搭建远程仓库
则查找顺序变为:
本地仓库->远程仓库->中央仓库
IDEA集成Maven
Maven项目的目录结构
maven-project01
|- src (源代码目录和测试代码目录)
|- main (源代码目录)
|- java (源代码java文件目录)
|- resources (源代码配置文件目录)
|- test (测试代码目录)
|- java (测试代码java目录)
|- resources (测试代码配置文件目录)
|- target (编译、打包生成文件存放目录)
Maven坐标详解
资源的唯一标识,通过坐标可以唯一定位资源位置
使用坐标可以定义或引入项目中需要的依赖
maven坐标的组成
groupId:
定义当前maven项目隶属组织的名称
(通常为域名反写)
artifactId:
定义当前项目名称
(通常为模块名称)
version:
定义当前项目的版本号
Maven项目的导入
引入pom.xml文件
依赖管理
依赖配置
<dependecies><dependecy><groupId></groupId><artifactId></artifactId></dependecy>
</dependecies>
依赖:当前项目运行所需要的jar包,一个项目中可以引入多个依赖
在pom.xml文件中引入当前依赖
1,pom.xml中编写标签
2,在标签中使用引入坐标
3,定义坐标的参数
依赖传递
依赖具有传递性
直接依赖:在当前项目中通过依赖配置建立依赖关系.
间接依赖:被依赖的资源如果依赖其他资源,当前项目间接依赖其他资源.
依赖的优先级
路径优先:依赖中出现相同资源,层级越深,优先级越低
声明优先:当资源在相同层级被依赖时,配置顺序靠前的优先级更高
特殊优先:当同一级配置了相同资源的不同版本,后配置的覆盖先配置的.
可选依赖
不会默认被继承子项目的项目依赖
通过
<optional>true</optional>
指定当前依赖是否可选
排除依赖
通过
<exclusion></exclusion>
主动断开依赖资源
依赖范围
默认可以在任何地方使用
可以通过
<scope>compile</scope>
<scope>test</scope>//测试范围内生效不参与打包
<scope>provided</scope>//不参与打包
<scope>runtime</scope>//不参与主程序
设置范围
Maven生命周期
主要分为三部分
每次执行生命周期会执行对应部分且在该生命周期之前的全部生命周期.
clean:清理工作
eg:
clean
移除上一次构建生成的文件
default:核心工作
eg:
Compile
编译项目源代码
Test
使用单元测试框架运行测试,(可以一键略过)
运行所有以Test结尾的测试类
package
打包编译好的文件
运行插件打包成jar包到target文件夹
install
安装项目到本地仓库
site:生成报告,发布站点等
生命周期可以在idea中直接双击执行,或者使用命令行执行
插件
maven本质上是一个插件执行框架,所以工作都基于插件执行.
默认maven在各个生命周期上都绑定有预设的插件,在执行到对应生命周期时执行对应插件功能.
分模块设计
在大型项目开发时,通常会将原始模块按照功能拆分为若干子模块方便项目的管理维护和拓展以及模块间的相互调用和资源共享.
对封装的公共组件进行使用:
1,直接依赖项目:
全部依赖存在性能问题
公开业务代码非常不安全
2,分模块设计
先设计模块,再进行编码.按功能将类抽取到模块中
继承和聚合
继承描述了两个工程之间的关系,与java继承类似,子工程可以继承父工程中的配置信息,常见于依赖关系的继承.
作用:
简化依赖配置
统一管理依赖
实现
先创建父工程
在子工程的pom.xml文件中配置继承关系
注:
groupid可以省略,自动继承父工程
relativepath指定父工程的pom文件位置
在父工程中配置所有子工程需要的依赖
子工程如果配置了和父工程一样的依赖,会使用子工程自己的依赖
版本锁定
多个模块使用同一个依赖,可以使用版本锁定统一管理依赖版本,同时升级版本.
在父工程的pom中配置
<dependencyManagement><dependencies><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.11</version></dependency></dependencies>
</dependencyManagement>
子工程依赖配置
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId>
</dependency>
属性配置
可以在文件固定位置统一管理配置父工程属性
聚合
将多个模块组织成一个整体,同时进行项目构建.
聚合工程
一个不具有业务功能的空文件(仅有一个POM)
作用
快速构建项目(无需根据依赖关系手动构建,直接在聚合工程上构建即可)
通过module标签聚合
<modules><module>../jd-mall-admin</module><module>../jd-mall-domain</module><module>../jd-mall-fresh</module><module>../jd-mall-market</module>
</modules>
继承和聚合
聚合用于快速构建项目
继承用于快速配置(提取共性配置)
相同点
打包方式均为pom,可以将两种关系制作到同一个pom中
均属于设计型模块
区别
聚合是在当前模块中配置关系,可以直到哪些模块参与了聚合
继承是在子模块中配置关系,无法知道哪些子模块继承了父模块.
私服
私服引入
将jar包传入私服仓库,其他人只需要知道依赖坐标就可以从仓库中下载.
如果使用的是第三方依赖,会先下载到私服仓库中,所有人可以直接从私服仓库中使用.
工程版本
SNAPSHOT(快照版本)
临时的输出版本,称为快照版本
快照版本会随着开发进展不断更新
RELEASE(发布版本)
向团队外部发布的稳定版本