Apache Maven


技术文档编写指南

学习文档:

每一部分都要以概念开始。以点带面。 针对学习文档,注意关注guideline,best practice和design pattern。最好以XX + 前面那三个单词去检索。

设计文档:

每一部分仍然以核心概念开始,如果核心概念比较详细,那么写在这部分的开头,如果核心概念描述简单,那么直接作为标题。

使用文档:

Maven

1 Maven

1.1 Maven是什么?

Maven是服务Java开发的 构建项目管理 工具。

构建

包含编译、测试、打包、部署等等一系列开发流程。

项目管理

包含:

1.2 Maven哲学

Maven的哲学是 「约定优于配置」,就像Philosophy of Maven中提到的,通过这种设计哲学,最终实现:

visibility, reusability, maintainability, and comprehensibility

的目标。

1.3 为什么要用Maven?

Make、Ant是Maven出现之前被广泛应用的构建工具,但是:

从另一方面说,Maven也是伴随着Java生态的繁荣而拥有较大的受众。

2 Maven 实践

2.1 settings.xml

安装中除了配置MAVEN_HOME比较关键的就是settings.xml的配置,.m2下的setting.xml用来配置Jar/Plugin仓库、server账号密码、镜像等等。详细的配置项可以参考:https://maven.apache.org/settings.html

2.2 依赖管理

概念:

除了build的自动化,Maven的另一个强大功能是依赖管理,依赖通过坐标方式在pom.xml中手动配置引入。所谓坐标,就是作为项目唯一标识的一组gruopId/artifactId/version的标签集合。

(1) 依赖范围 & 依赖传递

依赖范围是指引入依赖的生效classpath,其中classpath包含:1. 编译classpath。2.测试classpath。3.运行classpath。

其中compile在三种classpath都生效。test仅在测试claspath有效。provided仅在编译和测试classpath有效。runtime只在测试和运行classpath有效。

依赖范围:

依赖传递: 依赖传递是福也是祸,这种机制大大方便了传递性依赖引入的问题,如A->B->C,其中A并不用关心B的依赖,Maven会替你做这件事。但是带来的问题是无穷无尽的依赖冲突问题。

其中依赖范围会影响依赖的传递,如下:

(2)可选依赖(optional)

optional解决也是依赖传递的问题,如:A->B,B->C(optional),当C声明为optional时对B无影响,只不过A不会引入C,如果C对于A是必须的,需要手动引入。

stackoverflow(https://stackoverflow.com/questions/40393098/when-to-use-optionaltrue-optional-and-when-to-use-scopeprovided-scope) 上有对 optional 和 provided 区别的讨论。不过从根本上来讲,二者表达的不是同一类问题,optional关注的只是传递性依赖的问题,而 provided 更多关注的是当前依赖的有效范围的问题(在哪个classpath有效),在此基础上也要解决这种scope传递的问题。

**(3)依赖解析 **

概念:

两种情景:

2.3 生命周期与插件

概念:

Maven拥有相互独立的三套生命周期,分别是 clean、default、site。

其中default的Phase较多,如下是其中一部分阶段以及阶段与插件Goal的绑定。需要注意的是,生命周期是独立的,但是单独生命周期的Phase是后面包含前面的。如install的执行通常也意味着package也会执行。

maven life and plugin

2.4 聚合&继承

概念:

在继承中,有一个重要的概念是依赖管理,通过标签统一管理各个模块的依赖版本,达到全项目依赖版本统一的目的。同样针对插件管理,在下也存在做同样的事情。

如果继承了parent的pom,那么从parent继承到的信息包含:

3 进一步谈maven依赖机制

3.1 传递性依赖

maven从2.0开始支持传递性依赖特性,希望解决的是传递性依赖「自动引入的问题」:

This allows you to avoid needing to discover and specify the libraries that your own dependencies require, and including them automatically.

因为传递性依赖会造成项目依赖的爆炸性增长,所以maven存在一些额外的特性用来对依赖进行约束和限制:

3.2 依赖确定机制

原则 & 优先级:

更详细的可以看下官方文档,里面的例子很清晰。

End - 几个命令