Maven 是一项 Java 核心技术栈,主要用于项目构建和依赖管理。

本文根据尚硅谷 Maven 课程,对 Maven 知识点进行整理与分享。

课程:尚硅谷 Maven 课程

1. Maven 相关概念

1.1 Maven 作用

Maven 是 Apache 软件基金会的自动化构建工具,为 Java 平台的项目构建依赖管理提供帮助。

Maven 的词义是 专家,内行。

生产环境需要多个 jar 包,并对其进行管理。Maven的作用就是管理 jar 包。具体包括以下作用:

  • 添加第三方 jar 包。Maven可以保证每个 jar 包在系统中只存在一份,而不是每个模块都放一份。

  • 管理 jar 包之间的依赖关系。

  • 获取第三方 jar 包。可以理解为类似 EndNote 的管理体系,也就是不仅能管理,还能下载。

  • 将项目拆分为多个工程。工程间的调用和访问,可以通过 Maven 的依赖管理机制实现。

1.2 Maven 项目构建

项目构建,可以从三方面来看:

  • Java 代码构建:Java 代码需要编译,才能执行。
  • Web 工程构建:Web 工程需要先编译,再部署到服务器中,再启动服务器,才能执行。
  • 实际项目构建:实际项目需要整合第三方框架。除了配置 Web 工程,还要提供第三方框架的 jar 包和各种配置文件,将它们部署到服务器并启动服务器,才能执行。

开发过程中,所有路径或配置文件中配置的路径,都是以编译结果的目录结构为标准的。

构建环节,包括以下内容:

  • 清理:删除旧的编译结果 class 文件,为下一次编译做准备。
  • 编译:将 Java 源程序编译为 class 字节码文件。
  • 测试:对项目关键节点进行测试,调用 junit 程序。
  • 报告:每次测试后以标准格式记录和展示测试结果。
  • 打包:将动态工程封装为压缩文件,用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
  • 安装:Maven 的特定概念,将 jar 包或 war 包安装到本地仓库。
  • 部署:将打包的结果部署到远程仓库,或将 war 包部署到 Servlet 容器的指定目录下,使其可以运行。

Maven 的作用就是,可以自动完成上述全部构建过程。如下图所示。

image-20201225074445721

image-20201225074500653

1.3 Maven 自动化构建原理

Maven 自动化构建原理,包括以下内容:

  • POM
  • 约定的目录结构
  • 坐标
  • 依赖管理
  • 仓库管理
  • 生命周期
  • 插件和目标
  • 继承
  • 聚合

Maven 的核心程序提供了抽象生命周期,而具体操作由Maven插件来完成。

1.4 POM

POM,即 Project Object Model 项目对象模型,在项目中体现为 pom.xml。

pom.xml 是 Maven 工程的核心配置文件,与构建过程相关的一切设置都在这个文件中。类似于 web.xml 对于动态 Web 工程。

1.5 坐标

Maven 中使用以下三个坐标可以唯一确定一个 Maven 工程。

  • groupId:公司或组织域名倒序 + 项目名。

    • 例如:

    • com.bluestragglers.maven
  • artifactId:模块名称。

    • 例如:

    • helloworld
  • version:版本号。

    • 例如:

    • 1.0.0
  • 上述坐标对应文档路径存储在:

  • /com/bluestragglers/maven/helloworld/helloworld-1.0.0.jar

坐标可以简称为 GAV,不要只记住后两个字母(。

1.6 依赖

课程介绍了两个课外内容:

  • snapshot:快照,是会频繁进行迭代开发的版本。
  • release:完成版本,可以达到发布要求。

依赖内容:

<dependency>
    <groupId>com.bluestragglers.com</groupId>
    <artifactId>Hello</artifactId>
    <version>0.0.1-SNAPCHAT</version>
    <scope>compile</scope>
</dependency>

Maven 解析依赖信息时会到本地仓库中查找被依赖的 jar 包。对于自己开发的 Maven 工程,使用 install 命令安装后就可以放入仓库。

依赖的范围包括三种:

  • compile
  • test
  • provided

区别包括:

image-20210119064510104

image-20210119064444110

image-20210119064426287

test 典型例子是编写 junit,只测试,不参与主程序和打包。

provided 典型例子是编写 servlet-api.jar,不参与打包、部署和运行。

依赖具有传递性。根据依赖是 compile, test 和 provided,确定是否能够传递。像 test 就不能传递。

依赖排除,通过 实现。

<exclusions>
    <exclusion>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
    </exclusion>
</exclusions>

统一管理版本号,建议采用 properties 标签内统一声明版本号。需要同一版本的位置,使用$(自定义标签名)来统一版本位置。

  • properties 标签统一声明可以用于各个场景。

1.7 继承

例如,针对问题:

  • Hello 依赖的 junit:4.0
  • HelloFriend 依赖的 junit:4.0
  • MakeFriend 依赖的 junit:4.9

需要将依赖的版本统一。

解决思路是,将 junit 依赖版本统一提取到父工程中,子工程声明依赖时不指定版本。

操作步骤:

  • 创建一个 Maven 工程作为父工程,打包方式是:POM(不是 jar 和 war)。
  • 在子工程中声明对父工程的引用。
  • 在子工程的坐标中删除与父工程重复的部分。
  • 在父工程中统一依赖。
  • 在子工程中删除不同的依赖。
<parent>
    <groupId>com.bluestragglers.maven</groupId>
    <artifactId>Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>0

    <!-- 以当前文件为基准的父工程pom.xml文件的相对路径 -->
    <relativePath>../Parent/pom.xml</relativePath>
</parent>

1.7 聚合

聚合的作用是一步安装各个模块工程。

可以另外设置一个聚合工程,也可以在父工程里配置。

<modules>
    <module>../Hello</module>
    <module>../HelloFriend</module>
    <module>../MakeFriends</module>
</modules>

配置完成后,在聚合工程的 pom.xml 上 install 即可。

1.8 配置

配置的作用是将包部署在远程仓库中。命令是 deploy。

内部 是配置工程构建过程中的特殊设置。 是构建过程中需要用到的插件。 是针对插件的配置。

<build>
    <finalName>BlueStragglers</finalName>
    <plugins>
        <plugin>
            <groupId>org.codehaus.cargo</groupId>
            <artifactId>cargo-maven2-plugin</artifactId>
            <version>1.2.3</version>
            <configuration>
                <container>
                    <containerId>tomcat6x</containerId>
                    <home>D:\DevInstall\apache-tomcat-6.0.39</home>
                </container>
            </configuration>
            <executions>
                <execution>
                    <id>cargo-run</id>
                    <phase>install</phase>
                    <goals>
                        <goal>run</goal>
                    </goals>
                </execution>
        </plugin>
    </plugins>
</build>

1.9 生命周期

Maven 三套Lifecycle 生命周期,分别是:

  • Clean Lifecycle:构建前的清理。
  • Default Lifecycle:构建的核心部分,包括编译、测试、打包、安装、部署等。
  • Site Lifecycle:构建后的生成项目报告,生成站点,发布站点。

三套生命周期相互独立,可以仅调用 clean 清理工作目录,site 生成站点,也可以 mvn clean install site 运行三个生命周期。

每套生命周期由一组phrase 阶段 组成,平时输入的命令对应于一个特定阶段,如 mvn clean 对应 Clean Lifecycle 的 clean 阶段。

Clean Lifecycle 包含三个阶段:

  • pre-clean
  • clean
  • post-clean

Site Lifecycle 包含四个阶段:

  • pre-site
  • site
  • post-site
  • site-deploy

最重要的 Default Lifecycle 包含以下阶段:

  • process-resources:复制并处理资源文件到目标目录,准备打包。
  • compile:编译项目源码。
  • process-test-resources:布置并处理资源文件到目标测试目录。
  • test-compile:编译测试源码。
  • test:运行测试。不会打包或部署。

不论要执行这个生命周期中的哪个阶段,都是从这个生命周期开头开始执行。但进行到哪里是看指定的位置。

image-20210119144618731

image-20210119144625916

2. Maven 相关配置

2.1 Maven 基础配置

IDEA 使用 Maven,在 pom.xml 里面可以配置依赖 dependencies,在 Lifecycle 里面可以清理 clean,package 打包,install 安装等等。

通常采用 springboot 创建 web 工程。

Maven 工程目录结构:

  • 根目录:工程名。
  • src:源码。
  • pom.xml:Maven 工程的核心配置文件。
  • main:主程序。相应的,test 为测试程序。
  • java:Java 源文件。
  • resources:框架或其他工具的配置文件。

image-20210112204421940

设置 Maven 创建工程的 JDK 版本:

  • 打开 settings.xml,找到 profiles 标签,添加相应配置。

  • 
    jdk-1.8
    
        true
        1.8
      
      
        1.8
        1.8
        1.8
    
    

2.2 Maven 联网

Maven 核心程序仅仅定义了抽象的生命周期,而具体工作需要由特定插件完成,插件需要联网获取。

Maven 默认会在本地仓库先搜索。本地仓库地址默认位置为:[usr_home]\.m2\repository。

可以通过修改 Maven\conf\settings.xml 中的 localRepository 修改仓库位置。

3. Maven 常用命令

执行与构建过程相关的 Maven 命令,通过命令行构建,必须进入工程文件的 pom.xml 所在目录,随后执行相应命令即可。

常用的 Maven 命令包括:

  • mvn clean:清理。
  • mvn compile:编译主程序。
  • mvn test-compile:编译测试程序。
  • mvn test:测试。
  • mvn package:打包。
  • mvn install:安装。
  • mvn site:生成站点。
  • mvn deploy:将最终的包复制到远程仓库,从而将内容部署在服务器上运行。

执行这些命令都按照生命周期顺序进行,例如执行打包命令,会首先执行测试命令,随后再打包。