Maven 是什么?

  • Maven的意思是“专家,知识的积累着”,来自Yiddish语言,meyvn单词,意为“知识的积累者”
  • Maven是一个项目管理工具,基于项目对象模型(POM)管理项目,就是用XML描述一个项目的信息(主要是项目依赖jar,插件,仓库等等)
  • 同类型工具还有Ant,Gradle,目前Maven用的更普遍一些,同等工具还有nodejs下的npm等等
  • Maven最大的好处是,基于“约定大于配置”思想,在全世界做好了Java项目开发的规范,使得开发人员可以在多个项目间平滑迁移。
  • Apache的开源工具,开源免费

che/maven)

下载安装

下载地址 https://maven.apache.org/download.cgi
Maven核心概念全讲解 - 图1

  1. 下载压缩包解压可用,非常简单
  2. 需要预装JDK环境,并配置JAVA_HOME环境变量
  3. 将Maven的解压目录加入系统环境变量PATH
    Maven核心概念全讲解 - 图2

运行

运行Maven的语法如下:
mvn [选项] [<目标>] [<阶段>]
获取帮助命令 mvn -h

约定配置

一个Maven项目目录如下,约定如此:

  1. -- 项目目录
  2. ----src 资源目录,存放项目代码
  3. ------main 代码主目录,存放项目主体代码
  4. --------java 存放java代码
  5. --------resource 存放资源代码
  6. ------test 测试目录,存放测试相关代码
  7. --------java 存放java代码
  8. --------resource 存放资源代码
  9. -----target 打包输出目录,存放项目打包后输出的jarwar
  10. -------classes 编译输出目录
  11. -------test-classes 测试代码编译输出目录
  12. --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:

  1. <localRepository>C:/MyLocalRepository</localRepository>

远程仓库修改需要修改项目中的pom.xml文件

  1. <repositories>
  2. <repository>
  3. <id>companyname.lib1</id>
  4. <url>http://download.companyname.org/maven2/lib1</url>
  5. </repository>
  6. <repository>
  7. <id>companyname.lib2</id>
  8. <url>http://download.companyname.org/maven2/lib2</url>
  9. </repository>
  10. </repositories>

中央仓库地址: https://mvnrepository.com/

可以web打开搜索依赖。

Maven依赖的搜索顺序:

  1. 本地仓库搜索,搜索到即使用,搜索不到就去中央仓库搜索
  2. 中央仓库搜索到则下载缓存到本地仓库,搜索不到则查找配置的远程仓库
  3. 如果没配置远程仓库,则报错,配置了远程仓库,则去远程仓库查找
  4. 远程仓库搜索到则下载到本地缓存,搜索不到则报错

POM 坐标

  1. <!-- 模型版本 -->
  2. <modelVersion>4.0.0</modelVersion>
  3. <!-- 公司或者组织的唯一标志,并且配置时生成的路径也是由此生成, 如com.companyname.project-group,maven会将该项目打成的jar包放本地路径:/com/companyname/project-group -->
  4. <groupId>com.companyname.project-group</groupId>
  5. <!-- 项目的唯一ID,一个groupId下面可能多个项目,就是靠artifactId来区分的 -->
  6. <artifactId>project</artifactId>
  7. <!-- 版本号 -->
  8. <version>1.0</version>
  9. </project>

Maven生命周期

Maven核心概念全讲解 - 图3

  • 验证 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的所有生命周期都是由插件完成的,你也可以自定义自己的插件,用来实现特定的功能。

常用的命令

  1. # 清理
  2. mvn clean
  3. # 编译
  4. >mvn compile
  5. # 安装
  6. mvn install
  7. # 先清理再部署
  8. mvn clean deploy
  9. # 生成站点文档
  10. mvn site

IDEA中使用Maven

idea自带了maven,使用非常方便,都是图形界面化操作,在项目的右侧导航栏,对应的生命周期之间双击鼠标即可

Maven核心概念全讲解 - 图4
具体的设置如下图:
Maven核心概念全讲解 - 图5