1. 什么是Maven
1.1 Maven的概念
Maven 是 Apache 软件基金会组织维护的一款自动化构建工具,专注服务于 Java 平台的项目构建和依赖管理。
1.2 为什么要使用Maven?
- 在项目开发中,我们需要引用各种 jar 包,引用的 jar 包可能有几十个乃至上百个,每个都要到其官网去下载,而且每个 jar 包都需要手动引入到工程目录,期间会经常遇到 jar 包冲突、版本冲突等。Maven 可以自动下载 jar 包及依赖包添加到项目中,大大减轻了工作负担。
- Java 文件需要编译成二进制字节码文件,我们可以借助各种集成开发工具完成,如 IDEA 可以将代码即时编译。但有时候我们需要多个模块同时编译,就必须要借助于 Maven 工具了。
- 每个项目或模块开发过程中都可能会有 bug,因此写完了代码,还要写一些单元测试,然后一个个的运行来检验代码质量,Maven 提供了专门的测试插件来实施测试。
- 我们需要把代码与各种配置文件、资源整合到一起,定型打包。如果是 web 项目,还需要将其发布到服务器进行调用,这些都可以通过 Maven 轻松搞定。
1.3 项目的构建过程
构建(build)是面向过程的(从开始到结尾的多个步骤),涉及到多个环节的协同工作。
构建过程的几个主要环节:
- 清理:删除以前的编译结果,为重新编译做好准备。
- 编译:将 Java 源程序编译为字节码文件。
- 测试:针对项目中的关键点进行测试,确保项目在迭代开发过程中关键点的正确性。
- 报告:在每一次测试后以标准的格式记录和展示测试结果。
- 打包:将一个包含诸多文件的工程封装为一个压缩文件用于安装或部署。Java 工程对应 jar 包,Web 工程对应 war 包。
- 安装:在 Maven 环境下特指将 jar 包安装到本地仓库中。这样 jar 包项目就可以被其他的 Maven 项目通过依赖的方式引入。
- 部署:将 jar 包部署到私服上,其他开发人员就可以从公司私服下载并安装到本地仓库。
1.4 Maven的两大核心功能
1.4.1 项目构建
对项目进行编译、测试、打包、部署等构建。
1.4.2 依赖管理
对 jar 包的统一管理,Maven 提供中央仓库、私服、本地仓库来解决 jar 包的依赖和相关依赖的下载。在项目中使用 标签引入依赖后,Maven 会从远程仓库或本地仓库获取对应的 jar 包并添加到当前项目中。
如下图所示,包括蓝、黄两个部分分别对应着依赖管理和项目构建两大核心功能:
2. Maven的核心概念
2.1 什么是POM
POM(Project Object Model)项目对象模型,它是 Maven 的核心组件,是 Maven 中的基本工作单元。它是一个 xml 文件,以 pom.xml 文件方式存在于项目的根目录中。POM 不仅包含有关项目的信息及 Maven 用于构建项目的各种配置的详细信息,还包含目标和插件。
pom.xml 文件举例:
<!--添加父工程的引用-->
<parent>
<groupId>com.bjpowernode.xiaomi</groupId>
<artifactId>xiaomi-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<!--本项目的身份证号gav-->
<groupId>com.bjpowernode</groupId>
<artifactId>springmvc_006_ssm</artifactId>
<version>1.0.0</version>
<!--打包方式-->
<packaging>war</packaging>
<!--集中定义依赖版本号,使用属性-->
<properties>
<!--mysql驱动的依赖-->
<mysql.version>5.1.32</mysql.version>
</properties>
<!--添加依赖-->
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<build>
<!--聚合工程-->
<modules>
<module>xiaomi-manager-pojo</module>
<module>xiaomi-manager-mapper</module>
<module>xiaomi-manager-service</module>
<module>xiaomi-manager-web</module>
</modules>
<!--插件配置-->
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>17</source>
<target>17</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
<!--指定配置文件识别路径-->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2.2 什么是约定的目录结构
Maven 项目约定好了目录结构,所有的 Maven 项目都必须依照这个规范。主要的目的是将项目的源码文件、测试代码和资源文件完全分开,便于项目管理和扩展。
附:
1、如何理解 Maven 将源码和测试代码分开了?
如下图代码所示,就是将业务代码和测试代码杂糅在一起了:
2、文件夹的属性
在 Maven 项目中,目录结构已经定义好,并且不同的目录的属性也已经定义好了。
2.3 什么是坐标GAV
也称为 GAV 定位。使用三个标签来唯一定位 jar 资源,即 groupId、artifactId 和 version。坐标是资源的唯一定位,创建项目时定义 GAV 名称,引用项目时使用 GAV 名称。相当于项目的身份证号。
- groupId:组织名称,一般是公司域名的倒写,如 com.myphoenix
- artifactId:项目名称,如 big-marketing-lxx
- version:版本编号,如 1.0-SNAPSHOT(开发时的临时版本号)、5.2.5.RELEASE(发布版本)
2.4 什么是仓库
存放 jar 包的位置。Maven 中所有的 jar 包都在仓库中。仓库分为本地仓库和远程仓库。
2.4.1 本地仓库
- 本地仓库存储在本地机器上,默认存放在
~.m2\repository
中,为本机上的所有 Maven 工程服务。 - 可以通过 Maven 的配置文件 Maven_home/conf/settings.xml 修改本地仓库所在的目录。~ 是用户的主目录,Windows 系统中是
c:/user/用户名
注:结合仓库来看,GAV 实际上表现为一级级的目录。
1、在项目的 pom.xml 文件中引入 MySQL 依赖:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.22</version> </dependency>
2、查看本地仓库配置:
3、打开本地仓库:
C:\Softwares\Developer_Kits\apache-maven-3.8.8\repository\mysql\mysql-connector-java\8.0.22
由上图可以看到,在 pom.xml 文件中,MySQL 依赖的 GAV 3 个标签对应了 3 层目录。
2.4.2 远程仓库
远程仓库包括:
- 为全世界范围内的开发人员提供服务的中央仓库
- 为全世界范围内某些特定的用户提供服务的中央仓库镜像
- 为本公司提供服务自己架设的私服。
中央仓库是 Maven 默认的远程仓库,其地址是 http://repo.maven.apache.org/maven2/,中央仓库包含了绝大多数流行的开源 Java 构件,以及源码、作者信息、许可证信息等。一般来说,简单的 Java 项目依赖的构件都可以在这里下载得到。
私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,私服代理广域网上的远程仓库,供局域网内的 Maven 用户使用。当 Maven 需要下载构件的时候,它先请求私服请求,如果私服上不存在该构件,则从外部的远程仓库下载,缓存在私服上之后,再为 Maven 的下载请求提供服务。我们还可以把一些无法从外部仓库下载到的构件上传到私服上。
程序员常用的一个仓库:http://mvnrepository.com/
2.5 什么是依赖
依赖就是 jar 包。
- 所有的资源都是以 GAV 的形式进行定义的,也是通过 GAV 来添加引用。
- 在
<dependencies>
大标签中,通过子标签<dependency>
指定 GAV 进行引用。
2.6 什么是生命周期
对应项目构建的过程,如下图:
构建项目时按照生命周期顺序构建,每一个阶段都有特定的插件来完成。无论我们要进行哪个阶段的构建,直接执行相应的命令即可,无需担心它前面的阶段是否构建,Maven 都会自动构建,也就是说都是从这个生命周期的最初阶段开始的。
使用 Intellij IDEA 后,生命周期要调用的命令被集成化一些按钮,只需要双击即可调用相应的插件来运行:
生命周期对应的 Maven 命令:
- mvn clean:清理。会删除原来编译和测试的目录,即 target 目录,但是已经 install 到仓库里的包不会删除。
- mvn compile:编译主程序。会在当前目录下生成一个 target 目录,里边存放编译主程序之后生成的字节码文件。
- mvn test-compile:编译测试程序。会在当前目录下生成一个 target 目录,里边存放编译测试程序之后生成的字节码文件。
- mvn test:测试。会生成一个目录 surefire-reports,保存测试结果。
- mvn package:打包主程序。会编译、编译测试、测试,并且按照 pom.xml 配置把主程序打包生成 jar 包或者 war 包。
- mvn install:安装主程序。会将本工程打包,并且按照本工程的坐标保存到本地仓库中。
- mvn deploy:部署主程序。部署到私服仓库中。
2.7 什么是插件
Maven 本质上是一个插件框架,插件就是集成化的功能。它的核心并不执行任何具体的构建任务,所有任务都交给插件来完成,例如编译源代码是由 maven-compiler-plugin 完成的。
进一步说,每个任务对应了一个插件目标,每个插件会有一个或者多个目标,例如 maven-compiler-plugin 的compile 目标用来编译位于 src/main/java/ 目录下的主源码,testCompile 目标用来编译位于 src/test/java/ 目录下的测试源码。
Maven 支持极简化的插件添加,在 <plugins>
大标签中添加 <plugin>
子标签引用插件: