Maven 是什么?
- Maven的意思是“专家,知识的积累着”,来自Yiddish语言,meyvn单词,意为“知识的积累者”
- Maven是一个项目管理工具,基于项目对象模型(POM)管理项目,就是用XML描述一个项目的信息(主要是项目依赖jar,插件,仓库等等)
- 同类型工具还有Ant,Gradle,目前Maven用的更普遍一些,同等工具还有nodejs下的npm等等
- Maven最大的好处是,基于“约定大于配置”思想,在全世界做好了Java项目开发的规范,使得开发人员可以在多个项目间平滑迁移。
- Apache的开源工具,开源免费
che/maven)
下载安装
下载地址 https://maven.apache.org/download.cgi
- 下载压缩包解压可用,非常简单
- 需要预装JDK环境,并配置JAVA_HOME环境变量
-
将Maven的解压目录加入系统环境变量PATH
运行
运行Maven的语法如下:
mvn [选项] [<目标>] [<阶段>]
获取帮助命令 mvn -h
约定配置
一个Maven项目目录如下,约定如此:
-- 项目目录
----src 资源目录,存放项目代码
------main 代码主目录,存放项目主体代码
--------java 存放java代码
--------resource 存放资源代码
------test 测试目录,存放测试相关代码
--------java 存放java代码
--------resource 存放资源代码
-----target 打包输出目录,存放项目打包后输出的jar或war包
-------classes 编译输出目录
-------test-classes 测试代码编译输出目录
--pom.xml 项目对象模型描述文件,是一个xml文件
一个项目的开发流程约定如下:
Maven提供一个中心仓库,大家把自己写好的代码打包成jar发布到中心仓库,用一段pom片段描述项目信息,别人使用该项目的时候,引入该pom片段,Maven自动把相关jar依赖下载并配置到项目开发环境中,如果多个jar之间有相互依赖或继承等关系,Maven会自动处理好。
Maven仓库
仓库分为:
- 中央(central)
- 远程(remote)
- 本地(local)
中央仓库是中心节点,有Maven社区提供,但是各国或各公司网络访问中心仓库速度可能很慢,所以可以自己搭建远程仓库,相当于中央仓库的一个缓存点,加快网络访问速度,还有一个问题,每次都下载jar是非常浪费带宽和时间的,所以在开发者本机也有一个本地仓库,用来缓存jar。
仓库本质就是一个文件夹,用来存放依赖jar等文件。
本地仓库目录默认存放在用户目录下.m2文件下
- .m2/respository/ 为仓库存放目录
- .m2/settings.xml 为Maven的设置文件
本地仓库路径修改需要修改setting.xml:
<localRepository>C:/MyLocalRepository</localRepository>
远程仓库修改需要修改项目中的pom.xml文件
<repositories>
<repository>
<id>companyname.lib1</id>
<url>http://download.companyname.org/maven2/lib1</url>
</repository>
<repository>
<id>companyname.lib2</id>
<url>http://download.companyname.org/maven2/lib2</url>
</repository>
</repositories>
中央仓库地址: https://mvnrepository.com/
可以web打开搜索依赖。
Maven依赖的搜索顺序:
- 本地仓库搜索,搜索到即使用,搜索不到就去中央仓库搜索
- 中央仓库搜索到则下载缓存到本地仓库,搜索不到则查找配置的远程仓库
- 如果没配置远程仓库,则报错,配置了远程仓库,则去远程仓库查找
- 远程仓库搜索到则下载到本地缓存,搜索不到则报错
POM 坐标
<!-- 模型版本 -->
<modelVersion>4.0.0</modelVersion>
<!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
<groupId>com.companyname.project-group</groupId>
<!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
<artifactId>project</artifactId>
<!-- 版本号 -->
<version>1.0</version>
</project>
Maven生命周期
- 验证 validate 验证项目 验证项目是否正确且所有必须信息是可用的
- 编译 compile 执行编译 源代码编译在此阶段完成
- 测试 Test 测试 使用适当的单元测试框架(例如JUnit)运行测试。
- 包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
- 检查 verify 检查 对集成测试的结果进行检查,以保证质量达标
- 安装 install 安装 安装打包的项目到本地仓库,以供其他项目使用
- 部署 deploy 部署 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
Maven 有以下三个标准的生命周期:
- clean:项目清理的处理
- default(或 build):项目部署的处理
- site:项目站点文档创建的处理
Clean 生命周期
当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:
- pre-clean:执行一些需要在clean之前完成的工作
- clean:移除所有上一次构建生成的文件
- post-clean:执行一些需要在clean之后立刻完成的工作
Default (Build) 生命周期
这是 Maven 的主要生命周期,被用于构建应用,包括下面的 23 个阶段:
- validate(校验) 校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
- initialize(初始化) 初始化构建状态,比如设置属性值。
- generate-sources(生成源代码) 生成包含在编译阶段中的任何源代码。
- process-sources(处理源代码) 处理源代码,比如说,过滤任意值。
- generate-resources(生成资源文件) 生成将会包含在项目包中的资源文件。
- process-resources (处理资源文件) 复制和处理资源到目标目录,为打包阶段最好准备。
- compile(编译) 编译项目的源代码。
- process-classes(处理类文件) 处理编译生成的文件,比如说对Java class文件做字节码改善优化。
- generate-test-sources(生成测试源代码) 生成包含在编译阶段中的任何测试源代码。
- process-test-sources(处理测试源代码) 处理测试源代码,比如说,过滤任意值。
- generate-test-resources(生成测试资源文件) 为测试创建资源文件。
- process-test-resources(处理测试资源文件) 复制和处理测试资源到目标目录。
- test-compile(编译测试源码) 编译测试源代码到测试目标目录.
- process-test-classes(处理测试类文件) 处理测试源码编译生成的文件。
- test(测试) 使用合适的单元测试框架运行测试(Juint是其中之一)。
- prepare-package(准备打包) 在实际打包之前,执行任何的必要的操作为打包做准备。
- package(打包) 将编译后的代码打包成可分发格式的文件,比如JAR、WAR或者EAR文件。
- pre-integration-test(集成测试前) 在执行集成测试前进行必要的动作。比如说,搭建需要的环境。
- integration-test(集成测试) 处理和部署项目到可以运行集成测试环境中。
- post-integration-test(集成测试后) 在执行集成测试完成后进行必要的动作。比如说,清理集成测试环境。
- verify (验证) 运行任意的检查来验证项目包有效且达到质量标准。
- install(安装) 安装项目包到本地仓库,这样项目包可以用作其他本地项目的依赖。
- deploy(部署) 将最终的项目包复制到远程仓库中与其他开发者和项目共享。
说明:
有一些与 Maven 生命周期相关的重要概念需要说明:
当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。
Site 生命周期
Maven Site 插件一般用来创建新的报告文档、部署站点等。
- pre-site:执行一些需要在生成站点文档之前完成的工作
- site:生成项目的站点文档
- post-site: 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
- site-deploy:将生成的站点文档部署到特定的服务器上
Maven的所有生命周期都是由插件完成的,你也可以自定义自己的插件,用来实现特定的功能。
常用的命令
# 清理
mvn clean
# 编译
>mvn compile
# 安装
mvn install
# 先清理再部署
mvn clean deploy
# 生成站点文档
mvn site
IDEA中使用Maven
idea自带了maven,使用非常方便,都是图形界面化操作,在项目的右侧导航栏,对应的生命周期之间双击鼠标即可
具体的设置如下图: