1. Maven 概述
Maven 不仅内置了以来管理,更有一个拥有庞大 Java 开源软件包的中央仓库
Maven 生命周期
Maven 主要有三种内置的生命周期,每个生命周期,都有自己的一个或一系列的阶段
clean
用于清理 Maven 产生的文件和文件夹,包含一个 clean 阶段site
用于处理项目文档的创建,包含一个 site 阶段,该阶段会生成项目的文档default
用于处理项目的构建和部署。以下时 default 生命周期所包含的主要阶段validate
该阶段用于验证所有项目的信息是否可用和正确process-resources
该阶段复制项目到发布包的位置compile
该阶段用于编译源码test
该阶段结合框架执行特定的单元测试package
该阶段按照特定发布包的格式来打包编译后的源码integration-test
该阶段用于处理集成测试环境中的发布包verify
该阶段运行校验发布包是否可用install
该阶段安装发布包到本地库deploy
该阶段安装最终的发布包到配置的库
在实际使用中,开发人员无需明确指定生命周期。相反只需要指定一个阶段,Maven 会根据指定的阶段来推测生命周期。例如。当 Maven 以 package 为运行参数时,default 生命周期都会得到执行。Maven 会按顺序运行所有阶段
每个阶段都由插件目标(goal)组成,插件目标是构建项目的特定任务
一些目标旨在特定阶段才有意义。例如,在 Maven 的 compile 目标中,Maven Compiler 插件在 compile 阶段是有意义的,而 Maven Checkstyle 插件的 checkstyle 目标可以会在任何阶段运行
Maven 的阶段、插件和目标的对应关系
2. 依赖管理
在 Java 中,可以用
groupId
、artifactId
、version
组成的Coordination
(坐标)唯一表示一个依赖任何基于 Maven 构建的项目本身也必须定义这 3 项,生成的包可以是 jar 包,也可以是 war 包或 ear 包
依赖管理中,一个非常重要的概念
scope
(范围)。 Maven 有以下 6 种不同的 scopecompile
默认就是 compile,它就表示被依赖项目需要参与当前项目的编译,后续的测试、运行周期也参与其中。打包时通常需要包含进去test
该类依赖项目仅参与测试相关的工作,包括测试代码的编译、执行。一般不需要这种类型的依赖runtime
表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。典型实例为 logback,如果希望使用Simple Logging Facade for Java (slf4j)
来记录日志,可以使用 logback 绑定provided
该类依赖只参与编译和运行,但并不需要在发布时打包进发布包。典型示例为 servlet-api,该类依赖通常由应用服务来提供system
从参与角度来说,与provided
相同,不过被依赖项不会从 Maven 仓库获取,而是从本地文件系统获取,所以一定要配合 systemPath 属性使用1
2
3
4
5
6
7<dependency>
<groupId>com.arcsoft.face</groupId>
<artifactId>arcsoft-sdk-face</artifactId>
<version>3.0.0.0</version>
<scope>system</scope>
<systemPath>${basedir}/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath>
</dependency>import
仅用于依赖关系管理部分中 pom 类型的依赖。import 表示指定的 pom 应该被替换为该 pom 的 dependencyManagement 部分中的依赖关系。为了集中大型多模块项目的依赖关系
3. 多模块构建
Maven 支持多模块构建。将一个大型软件产品划分为多个模块来进行开发,从而实现软件项目的 “高内聚、低耦合”
Maven 的多模块构建是通过一个名称为项目继承(project inheritance)的功能来实现的,它允许将一些需要继承的元素,在父模块的 pom 文件中进行指定
多模块项目包含一个父模块及多个子模块