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涉及的项目构建的环节:

  1. 清理 将以前编译的旧二进制文件删除,为下一次编译做准备
  2. 编译 将Java程序源文件编译成计算机可以执行的二进制文件
  3. 测试 自动测试[一般通过junit进行]
  4. 报告 汇报测试程序执行的结果
  5. 打包 将Java程序打包成对应的jar包或者War包
  6. 安装 将打包得到的文件复制到制定的Maven仓库中
  7. 部署 将对应的文件复制到可执行的容器内,使其可以运行

Maven Installation

  1. 安装JDK,配置JAVA_HOME环境变量
  2. 下载Maven二进制代码, 比如apache-maven-3.8.1-bin.tar.gz,并解压到制定文件夹下
  3. 配置MAVEN_HOME或者M2_HOME环境变量,通过mvn -v命令查看版本
  4. 添加MAVE_HOME/binpath环境变量

如果是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

  1. POM[Project Object Model]
    1. pom.xml Maven项目的核心配置未见,与构建过程相关的一切设置都是在pom.xml中完成的
  2. 坐标[Coordinate],通过下面三个属性值可以唯一确定一个maven的工程
    1. groupid: 组织名称例如,com.xyz.maven
    2. artifactid: 模块名或者项目名
    3. version: 版本号
  3. 仓库[Repository],Maven仓库有三种类型,基本上Maven项目会先搜索本地仓库,继而搜索远程仓库去寻找jar文件。
    1. 本地仓库: 只服务于当前计算机的Maven仓库
    2. 远程局域网仓库: 一般称作Nexus,是服务于整个局域网内部的所有Maven项目,常用于各种组织和公司。
    3. 远程中央仓库: 公开的jar文件仓库,服务于所有Maven项目。
  4. 依赖[Dependency],通过pom.xml中的标签dependenciesdependency,Maven项目会自动搜索本地仓库中对应的jar文件,如果没有找到,继而搜索远程仓库。
    1. 依赖范围[Scope]: 常用的有compile, test, provided, 其重要作用在于指定一个jar文件依赖在对应的程序类型中是否有效。比如test是只针对测试程的依赖,如果进行主程序编译,则不会倒入这个jar文件。

Maven Lifecycle

各个构建环节必须按照既定的正确顺序来执行,其最重要的特点是,无论要执行生命周期的哪个阶段,都要从这个生命周期的最开始执行