Maven 的生命周期和构建
# 40.Maven 的生命周期和构建
本文讲讲 Maven 的一键构建
# Maven 中的构建
我们自己本地开发的项目,往往都要经历编译、测试、运行、打包等一系列过程,然后放到 Tomcat 的目录下,启动 Tomcat(我们上一节就是这样做的)
上述过程就是构建,其实关于构建的概念在之前的博客里就讲过了:构建、依赖管理 (opens new window)
使用了 Maven 之后,我们可以将构建交给 Maven 进行管理,我们只需输入一条简单的命令即可!
在 Maven 中,将构建分为了以下步骤(或者叫阶段):
- clean 清理:清理临时文件
- compile 编译:编译项目,例如
src/main/java
是我们的源码存放目录,默认会将编译后的文件输出到 target 目录下 - test 测试:对测试用例进行测试,例如
src/test
/ 里存放了我们的测试代码,执行该步骤会对所有用例进行编译,然后逐个测试,并生成测试报告到控制台 - package 打包:将项目打成一个压缩包,默认是 jar 类型,可以通过配置
<packaging>war</packaging>
来对 web 项目进行打包 - install 安装:发布本项目的依赖到本地仓库中
- deploy 部署:发布本项目到远程仓库中
- 还有一些阶段我们没有列出来,后续再说。
上述每一个步骤都有对应的命令,代表了构建的不同阶段; 所有步骤合起来就是一次完整的构建步骤,在 Maven 中一次构建可以看成是一个生命,并且有不同的阶段。
例如我们想要测试的话,怎么做呢?执行 mvn test
; 想要编译,则执行 mvn compile
。是的没错,我们之前已经开始使用 Maven 的构建来管理项目了!
使用了 mvn test
之后,我们不用一个一个去点测试用例,而使用了 mvn compile
,我们不用一个一个去编译源文件,非常方便。
# mvn clean
clean 是 Maven 工程的清理命令,执行 clean 会删除 target 目录及内容。
为什么我们需要 clean 呢?什么时候会用到这个命令呢?举个例子,在公司里接手别人开发后的项目,在该项目里通常会包含很多本地环境的信息、编译后的信息,然而不同电脑的开发环境通常是不一样的,所以需要 clean。
执行后,Maven 告诉我们删除了目录 target:
# mvn compile
compile 是 Maven 工程的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target 目录下。
我们在 cmd 执行 mvn compile,如下图提示成功:
查看 target 目录,class 文件已生成,编译完成。
# mvn test
test 是 Maven 工程的测试命令,会执行 src/test/java 下的单元测试类,并且会同时编译主代码(src/main/java)
cmd 执行 mvn test ,会编译执行 src/test/java 下单元测试类,输出到 target/test-classes 目录。
我们可以测试下,先删除 target 目录,然后再执行 mvn test:
可以看到最后的结果,运行了一个测试案例,全部成功。
在 target 目录下,也生成了主代码编译后的 class 文件夹,其中 test-classes 是测试类的 class 文件目录。
# mvn package
package 是 Maven 工程的打包命令,对于 Java 工程执行 package 打成 jar 包,对于 web 工程打成 war 包,并且同时会编译正式代码和测试代码。
可以在 pom.xml 文件里 指定打包的类型(第 10 行)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.peterjxl.LearnJavaMaven</groupId>
<artifactId>hello-world</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>Maven Hello World Project!</name>
<packaging>war</packaging>
2
3
4
5
6
7
8
9
10
之前我们已经分别演示过打包成 jar 包和 war 包了,这里就不再演示了。
# mvn install
install 是 Maven 工程的安装命令,会编译核心代码、测试代码,也会生成 jar 包或者 war 包,并且会将其发布到本地仓库:
在本地仓库的对应目录中,可以看到对应的 jar 包或者 war 包
这有什么用呢?举个例子,一个大型的项目中,通常会划分为几个小的模块,而每个模块也可以用 Maven 来管理!我们执行 mvn install 后,其他项目就可以使用坐标来引用依赖了!
# Maven 的生命周期
至此,我们演示了 Maven 关于构建的大部分命令,在 Maven 中,一次构建可以看成是一次生命,而生命中的每个阶段都有特定的命令对应,这就是 Maven 关于构建的生命周期。
每次构建的步骤如下:
清除项目编译信息 | 编译 | 测试 | 打包 | 安装 | 发布 |
---|---|---|---|---|---|
mvn clean | mvn compile | mvn test | mvn package | mvn install | mvn deploy |
当后面的命令执行时,前面的操作过程也都会自动执行:
- 例如执行 test 命令,也会执行编译的命令 compile;
- 执行打包 package,也会执行 test 和 compile 命令;
所以这就是为什么我们执行 mvn test 的时候,主代码也会被编译。
在 Maven 中,第一个命令 clean 叫做清理生命周期,后五个命令叫做默认生命周期,执行生命周期后面的命令,也会执行之前的命令
用人的生老病死来举例 Maven 的生命周期:
- clean:就好比一个人刚出生
- compile:童年
- test:少年
- package:青年
- install:成年
- deploy:老年
当一个人到了后面的生命周期的时候,之前的生命周期是一定经历过的。
其实 maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是 "三套",而且 "相互独立",这三套生命周期分别是:
- Clean Lifecycle:清理生命周期,在进行真正的构建之前进行一些清理工作,
- Default Lifecycle :默认生命周期,是构建的核心,含编译,测试,打包,部署等。也是我们主要掌握的生命周期
- Site Lifecycle :站点生命周期。用于生成项目报告,站点,发布站点。用的较少,了解即可
# 插件
生命周期是抽象的概念,具体干活的是插件(plugin),每一个命令都有一个底层的对应的插件,也就是说构建是由插件来完成的。
我们在执行构建的时候,也可以看到控制台里输出了具体的插件名:
# 集成 Tomcat 插件
Maven 内置了 Tomcat 插件,我们可以直接使用该插件来运行 Web 项目!我们以上一篇博客的 web 项目为例,在根目录下执行如下命令:
mvn tomcat:run
可以看到 Maven 使用了一个插件:tomcat-maven-plugin: 1.1,并告诉我们项目运行在了 http://localhost: 8080/hello-world/hello:
我们访问,可以看到项目是能成功访问的
这也就是我们说的一键构建。
# 小结
后续我们会介绍更多关于构建和插件的问题