Maven是一个Java项目管理和构建工具,它可以定义项目结构、项目依赖,并使用统一的方式进行自动化构建,是Java项目不可缺少的工具。

  • Maven使用pom.xml定义项目内容,并使用预设的目录结构;(和package.json)

  • 在Maven中声明一个依赖项可以自动下载并导入classpath;

  • Maven使用groupIdartifactIdversion唯一定位一个依赖。

  • Maven通过解析依赖关系确定项目所需的jar包,常用的4种scope有:compile(默认),testruntimeprovided

    Maven从中央仓库下载所需的jar包并缓存在本地;

    可以通过镜像仓库加速下载。

构建流程——生命周期

Maven通过lifecycle、phase和goal来提供标准的构建流程。

最常用的构建命令是指定phase,然后让Maven执行到指定的phase:(如下面的cleancompiletestpackage

  • mvn clean
  • mvn clean compile
  • mvn clean test
  • mvn clean package

通常情况,我们总是执行phase默认绑定的goal,因此不必指定goal。

使用插件

执行每个phase,都是通过某个插件(plugin)来执行的,Maven本身其实并不知道如何执行compile,它只是负责找到对应的compiler插件,然后执行默认的compiler:compile这个goal来完成编译。

Maven已经内置了一些常用的标准插件:

插件名称 对应执行的phase
clean clean
compiler compile
surefire test
jar package

使用自定义插件必须在pom.xml中声明插件及配置

模块管理

把每个模块当作一个独立的Maven项目,它们有各自独立的pom.xml[1]

可以提取出共同部分作为parent,parent的<packaging>pom而不是jar,因为parent本身不含任何Java代码。各个模块都可以直接从parent继承。

如果两个模块之间有依赖关系,需要从其中一个里引入另一个。

最后,在编译的时候,需要在根目录创建一个pom.xml统一编译,通过<modules>编译多个模块。

中央仓库、本地仓库与私有仓库

  • 中央仓库:上传到Maven里的
  • 私有仓库:非公网上的,需要在本地的~/.m2/settings.xml中配置好
  • 本地仓库:把本地开发的项目“发布”在本地,这样其他项目可以通过本地仓库引用它。容易出现版本不一致的情况。更好的方法是使用模块化编译。

mvnw

mvnw是Maven Wrapper的缩写。

对于某些项目来说,它可能必须使用某个特定的Maven版本,这个时候,就可以使用Maven Wrapper,它可以负责给这个特定的项目安装指定版本的Maven,而其他项目不受影响。

就是非全局的Maven版本

Artifact

使用Maven发布一个Artifact时:[2]

  • 可以发布到本地,然后推送到远程Git库,由静态服务器提供基于网页的repo服务,使用方必须声明repo地址;
  • 可以发布到central.sonatype.org,并自动同步到Maven中央仓库,需要前期申请账号以及本地配置;
  • 可以发布到GitHub Packages作为私有仓库使用,必须提供Token以及正确的权限才能发布和使用。

  1. 模块管理 - 廖雪峰的官方网站 (liaoxuefeng.com) ↩︎

  2. 发布Artifact - 廖雪峰的官方网站 (liaoxuefeng.com) ↩︎