Succinct Maven Tutorial [Maven简洁教程]
Maven是广泛使用在Java项目的自动构建工具,其本身也是有Java写成,所以算是相辅相成。之前虽然用过Maven,但是从来没有细致的了解过,这次写点东西也为了更好的了解。
Motivation & Background
常归的Java项目是通过包[Package]的形式进行管理,但是随着项目体积变大,Package不再是最佳的管理方式。更好的的方式是通过模块化分工,每个模块对应一个工程[Project],借助于Maven,就可以灵活的将一个大项目拆分成多个Project并进行惯例。
Java项目一般会涉及多个第三方jar包,同样的jar包会出现在多个项目中,传统方式要不断的手动复制,既费时又浪费存储空间。借助于Maven,可以将jar包保存在仓库[Repo]中,在需要的时候进行引用,并不需要进行文件复制,大大提高效率。
同时,第三方jar包众多,且版本不同,如何进行高效的管理是一个问题。借助于Maven,可以从其Repo中精确的获得对应的jar包,不会造成额外的问题。
最后,jar包之间可能也存在依赖关系,人工的了解这些复杂的依赖关系并且手动下载也是费时费力的事情,借助于Maven,这些依赖关系会被自动管理,不需要开发人员了解。
What is Maven
Maven是一款主要服务于Java平台的自动构建工具。目前主流构建工具包括:Make->Ant->Maven->Gradle,箭头代表了其演变过程。
Maven可以帮助项目进行快速的编译和部署。
Maven涉及的项目构建的环节:
- 清理 将以前编译的旧二进制文件删除,为下一次编译做准备
- 编译 将Java程序源文件编译成计算机可以执行的二进制文件
- 测试 自动测试[一般通过junit进行]
- 报告 汇报测试程序执行的结果
- 打包 将Java程序打包成对应的jar包或者War包
- 安装 将打包得到的文件复制到制定的Maven仓库中
- 部署 将对应的文件复制到可执行的容器内,使其可以运行
Maven Installation
- 安装JDK,配置
JAVA_HOME
环境变量 - 下载Maven二进制代码, 比如
apache-maven-3.8.1-bin.tar.gz
,并解压到制定文件夹下 - 配置
MAVEN_HOME
或者M2_HOME
环境变量,通过mvn -v
命令查看版本 - 添加
MAVE_HOME/bin
到path
环境变量
如果是Ubuntu系统,也可以通过apt
方式安装
sudo apt update
sudo apt install maven
此种安装方式,Maven的路径一般是/usr/share/maven
Maven Command
在Maven中,与构建流程相关的命令,必须进入pom.xml文件所在目录才能使用。其中常用的有:
mvn clean: 清理
mvn compile: 编译主程序
mvn test-compile: 编译测试程序
mvn test: 运行测试
mvn package: 程序打包
mvn install: 将打包好的程序放入本地仓库
Maven Core Concept
- POM[Project Object Model]
- pom.xml Maven项目的核心配置未见,与构建过程相关的一切设置都是在pom.xml中完成的
- 坐标[Coordinate],通过下面三个属性值可以唯一确定一个maven的工程
- groupid: 组织名称例如,com.xyz.maven
- artifactid: 模块名或者项目名
- version: 版本号
- 仓库[Repository],Maven仓库有三种类型,基本上Maven项目会先搜索本地仓库,继而搜索远程仓库去寻找jar文件。
- 本地仓库: 只服务于当前计算机的Maven仓库
- 远程局域网仓库: 一般称作Nexus,是服务于整个局域网内部的所有Maven项目,常用于各种组织和公司。
- 远程中央仓库: 公开的jar文件仓库,服务于所有Maven项目。
- 依赖[Dependency],通过pom.xml中的标签
dependencies
和dependency
,Maven项目会自动搜索本地仓库中对应的jar文件,如果没有找到,继而搜索远程仓库。- 依赖范围[Scope]: 常用的有
compile
,test
,provided
, 其重要作用在于指定一个jar文件依赖在对应的程序类型中是否有效。比如test
是只针对测试程的依赖,如果进行主程序编译,则不会倒入这个jar文件。
- 依赖范围[Scope]: 常用的有
Maven Lifecycle
各个构建环节必须按照既定的正确顺序来执行,其最重要的特点是,无论要执行生命周期的哪个阶段,都要从这个生命周期的最开始执行。