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 的阶段、插件和目标的对应关系

    img

2. 依赖管理

  • 在 Java 中,可以用 groupIdartifactIdversion 组成的 Coordination(坐标)唯一表示一个依赖

  • 任何基于 Maven 构建的项目本身也必须定义这 3 项,生成的包可以是 jar 包,也可以是 war 包或 ear 包

  • 依赖管理中,一个非常重要的概念 scope (范围)。 Maven 有以下 6 种不同的 scope

    1. compile 默认就是 compile,它就表示被依赖项目需要参与当前项目的编译,后续的测试、运行周期也参与其中。打包时通常需要包含进去

    2. test 该类依赖项目仅参与测试相关的工作,包括测试代码的编译、执行。一般不需要这种类型的依赖

    3. runtime 表示被依赖项目无需参与项目的编译,不过后期的测试和运行周期需要其参与。典型实例为 logback,如果希望使用 Simple Logging Facade for Java (slf4j) 来记录日志,可以使用 logback 绑定

    4. provided 该类依赖只参与编译和运行,但并不需要在发布时打包进发布包。典型示例为 servlet-api,该类依赖通常由应用服务来提供

    5. 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>
    6. import 仅用于依赖关系管理部分中 pom 类型的依赖。import 表示指定的 pom 应该被替换为该 pom 的 dependencyManagement 部分中的依赖关系。为了集中大型多模块项目的依赖关系

3. 多模块构建

Maven 支持多模块构建。将一个大型软件产品划分为多个模块来进行开发,从而实现软件项目的 “高内聚、低耦合”

Maven 的多模块构建是通过一个名称为项目继承(project inheritance)的功能来实现的,它允许将一些需要继承的元素,在父模块的 pom 文件中进行指定

多模块项目包含一个父模块及多个子模块