项目管理工具Maven的使用
1 简介
1.1 概述
- Maven是一款项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)
1.2 功能
- 项目构建:提供标准的、跨平台的自动化项目构建方式
- 依赖管理:方便快捷地管理项目依赖的资源(jar包),避免资源间的版本冲突问题
- 统一开发结构:提供标准、统一的项目结构
2 安装配置
2.1 下载Maven
- 下载地址,
https://maven.apache.org/download.cgi
如果是Windows平台,选择zip安装包下载
2.2 解压、移动文件
- 解压zip文件,
将maven根目录移动到一个固定的目录下,
2.3 配置环境变量
2.3.1 MAVEN_HOME
- 新建一个系统环境变量,命名为MAVEN_HOME,值为maven根目录的路径
2.3.2 Path
- 编辑环境变量Path,在末尾添加maven bin目录的路径,
2.4 测试
- 重新打开一个cmd窗口,执行命令mvn,
如果出现上图中的提示信息,说明安装成功
3 基本概念
3.1 仓库
- 仓库用于存储资源,包含各种jar包
3.1.1 分类
- 本地仓库:自己电脑上存储资源的仓库,必要时从远程仓库获取资源
- 远程仓库:
(1)中央仓库:Maven团队维护,存储绝大多数资源
(2)私服:部门/公司范围内存储资源的仓库,必要时从中央仓库获取资源
3.1.2 私服的作用
- 保存具有版权的资源,包含购买或自主研发的jar包
- 一定范围内共享资源,仅对内部开发,不对外共享
3.2 坐标
3.2.1 作用
- Maven中的坐标用于描述仓库中资源的位置
- 使用唯一标识,唯一性定位资源位置,通过该标识可以将资源的识别与下载工作交由机器完成
3.2.1 组成
- groupId:当前Maven项目隶属的组织名称(通常是域名反写,例如:org.mybatis)
- artifactId:当前Maven项目名称(通常是模块名称,例如CMS、SMS)
- version:当前版本号
3.3 仓库配置
3.3.1 本地仓库路径
- 打开%MAVEN_HOME%\conf目录下的settings.xml配置文件,定位到localRepository标签,
添加一个localRepository标签,内部填上本地仓库的路径(默认为:${user.home}/.m2/repository)
3.3.2 镜像仓库地址
- 定位到mirros标签,在内部添加如下一段配置,
1 | <mirror> |
将Aliyun Maven仓库设置为中央仓库的镜像
4 实践
4.1 目录结构
1 | $ tree maven_demo/ |
4.2 pom.xml
1 | <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
4.3 常用命令
4.3.1 项目构建:mvn compile
- 在maven项目根目录下执行mvn compile命令,
maven将自动下载项目所需依赖和maven插件,然后进行构建
4.3.2 项目测试:mvn test
- 除了在控制台展示测试结果,还在target\surefire-reports目录下生成测试数据文件
4.3.3 清理编译产物:mvn clean
- mvn clean命令将整个target目录删除
4.3.4 打包:mvn package
- 打包的过程需要经历:主程序编译、测试程序编译、执行测试程序、最终打包,然后jar(war)包会被存放在target目录下,其中只包含主程序,不包含测试程序
4.3.5 安装本地仓库:mvn install
- mvn install命令依然会经过:主程序编译、测试程序编译、执行测试程序、打包等步骤
4.4 依赖管理
- 依赖指当前项目运行所需的jar包,一个项目可以设置多个依赖
4.4.1 配置格式
1 | <!-- 定义项目依赖--> |
4.4.2 依赖传递
4.4.2.1 依赖的传递性
- 直接依赖:在当前项目中通过依赖配置建立的依赖关系
- 间接依赖:被依赖的资源如果依赖其他的资源,当前项目间接依赖其他资源
4.4.2.2 依赖传递冲突问题
- 路径优先:当依赖中出现相同的资源时,层级越深,优先级越低;层级越浅,优先级越高
- 声明优先:当资源在相同层级被依赖时,配置顺序靠前的覆盖配置顺序靠后的
4.4.3 可选依赖(不透明)
- 可选依赖指对外隐藏当前所依赖的资源
1 | <!-- 定义项目依赖--> |
4.4.4 排除依赖(不需要)
- 排除依赖指主动断开依赖的资源,被排除的资源无需指定版本
1 | <!-- 定义项目依赖--> |
4.4.5 依赖范围
- 依赖的jar默认情况可以在任何地方使用,可以通过scope标签设定其依赖范围
4.4.5.1 依赖作用范围
- 主程序范围有效(main文件夹范围内)
- 测试程序范围有效(test文件夹范围内)
- 是否参与打包(package指令范围内)
scope | 主代码 | 测试代码 | 打包 | 范例 |
---|---|---|---|---|
compile(默认) | Y | Y | Y | log4j |
test | Y | junit | ||
provided | Y | Y | servlet-api | |
runtime | Y | jdbc |
4.5 生命周期
4.5.1 什么是Maven构建生命周期
- Maven构建生命周期描述的是一次构建过程经历的事件
4.5.2 阶段
- clean:清理工作
- default:核心工作,例如编译、测试、打包、部署等
- site:产生报告,发布站点等
4.5.3 clean生命周期
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
4.5.4 default生命周期
生命周期阶段 | 描述 |
---|---|
validate | 验证项目是否正确,并且所有必要的信息可用于完成构建过程 |
initialize | 建立初始化状态,例如设置属性 |
generate-sources | 产生任何的源代码包含在编译阶段 |
process-resources | 复制和处理资源到目标目录,准备打包阶段 |
compile | 编译该项目的源代码 |
process-classes | 从编译生成的文件提交处理,例如:Java类的字节码增强/优化 |
generate-test-sources | 生成任何测试的源代码包含在编译阶段 |
process-test-sources | 处理测试源代码,例如:过滤器任何值 |
test-compile | 编译测试源代码到测试目标目录 |
process-test-classes | 处理测试代码文件编译生成的文件 |
test | 运行测试使用合适的单元测试框架(JUnit) |
prepare-package | 执行必要的任何操作的实际打包之前准备一个包 |
package | 提取编译后的代码,并在其分发格式打包,如JAR、WAR或EAR文件 |
pre-integration-test | 完成执行集成测试之前所需操作。例如,设置所需的环境 |
integration-test | 处理并在必要时部署软件包到集成测试可以运行的环境 |
post-integration-test | 完成集成测试已全部执行后所需操作。例如:清理环境 |
verify | 运行任何检查,验证包是有效的,符合质量审核规定 |
install | 将包安装到本地存储库,它可以用作当地其他项目的依赖 |
deploy | 复制最终的包到远程仓库与其他开发者和项目共享 |
4.5.6 site生命周期
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site:执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到服务器上
4.6 插件
- 插件与生命周期内的阶段绑定,在执行到对应生命周期时执行对应的插件功能
- 默认Maven在各个生命周期上绑定有预设的功能
- 通过插件可以自定义其他功能,
1 | <build> |