第 5 章 深入Maven构建工具 ..5.1Maven生命周期 Maven有3种生命周期:Clean生命周期、Default生命周期和Site生命周 期,Default生命周期是Manen的主要生命周期。 5.1 项目构建过程与Maen生命周期 1.v Maven用于项目构建和管理。Maven把项目构建和管理过程定义为生命 周期。 一个典型的Maven生命周期是由7个阶段组成的, 1、1所示。 如图5.表5. 图5.n生命周期 1 Mave 72轻量级JavaEEWeb框架技术———SpringMVC+Spring+MyBatis+SpringBoot 表5.1Maven生命周期 阶段描述 验证(validate) 验证项目是否正确且所有必需信息是可用的 编译(compile) 源代码编译在此阶段完成 测试(test) 使用适当的单元测试框架(例如JUnit)进行测试 打包(package) 创建jar/war包,如在pom.xml中定义的包 检查(verify) 对集成测试的结果进行检查,以保证项目质量达标 安装(install) 安装打包的项目到本地仓库,以供其他项目使用 部署(deploy) 复制最终的项目包到远程仓库中,以共享给其他开发人员和项目 为了完成Default生命周期,这些阶段(包括其他未列出的生命周期阶段)将按顺序 执行。 Maven的3种生命周期相互独立的,这3种生命周期不能看成一个整体。每个生命 周期的各个环节都是由各种插件完成的。 有些项目的管理不在Maven的生命周期中,例如项目骨架的创建不在Maven的生 命周期中。 5.1.2 Clean生命周期 Clean生命周期是在进行真正的构建之前需要进行的清理工作。Clean生命周期包 含3个阶段: (1)清理前(pre-clean):执行一些需要在清理之前完成的工作。 (2)清理(clean):移除所有上一次构建生成的文件。 (3)清理后(post-clean):执行一些需要在清理之后立刻完成的工作。 5.1.3 Default生命周期 Dealvn的主要生命周期, 包括23个阶段,2 fut生命周期是Mae用于构建应用, 如表5. 所示。 表5.2 Maven的Default生命周期 阶段描述 校验(validate) 初始化(initialize) 校验项目是否正确并且所有必要的信息可以完成项目 的构建过程 初始化构建状态,例如设置属性值 生成源代码(generate-sources) 生成包含在编译阶段中的任何源代码 处理源代码(proces-sources) 处理源代码,例如过滤任意值 续表 第5章深入Maven构建工具73 阶段描述 生成资源文件(generate-resources) 生成将包含在项目包中的资源文件 处理资源文件(process-resources) 处理资源并复制到目标目录,为打包阶段做好准备 编译(compile) 编译项目的源代码 处理类文件(process-classes) 处理编译生成的文件,例如对Javaclass文件进行字节码 改善优化 生成测试源代码(generate-test-sources) 生成包含在编译阶段中的任何测试源代码 处理测试源代码(process-test-sources) 处理测试源代码,例如过滤任意值 生成测试资源文件(generate-test-resources) 为测试创建资源文件 处理测试资源文件(process-test-resources) 处理测试资源并复制到目标目录 编译测试源代码(test-compile) 编译测试源代码到测试目标目录 处理测试类文件(process-test-classes) 处理测试源代码编译生成的文件 测试(test) 使用合适的单元测试框架运行测试(JUint是其中之一) 准备打包(prepare-package) 在实际打包之前,执行必要的操作,为打包做准备 打包(package) 将编译后的代码打包成可分发格式的文件,例如jar、war 或者ear文件 集成测试前(pre-integration-test) 在执行集成测试前进行必要的操作。例如搭建需要的 环境 集成测试(integration-test) 处理和部署项目到可以执行集成测试的环境中 集成测试后(post-integration-test) 在执行集成测试完成后进行必要的操作,例如清理集成 测试环境 验证(verify) 进行必要的检查,验证项目包有效且达到质量标准 安装(install) 安装项目包到本地仓库,这样项目包可以用作其他本地 项目的依赖包 部署(deploy) 将最终的项目包复制到远程仓库中,与其他开发者和项 目共享 5.4 Ste生命周期 1.i Site生命周期生成和部署项目的站点。Site生命周期包括4个阶段: (1)生成站点前(pre-site):执行一些需要在生成站点之前完成的工作。 (2)生成站点(site):生成项目的站点。 (3)生成站点后(post-site):执行一些需要在生成站点之后完成的工作,并且为站点 部署做准备。 (4)站点部署(site-deploy):将生成的站点部署到特定的服务器上。 74轻量级JavaEEWeb框架技术———SpringMVC+Spring+MyBatis+SpringBoot5.1.5生命周期内各阶段和生命周期之间的关系 在一种生命周期内,前后阶段是相互依赖的,如果运行一个阶段的命令,则在该阶段 之前的阶段都会被执行。例如,在Clean生命周期内,有3个阶段:清理前、清理和清理 后,如果执行mvnpost-clean命令,则在此之前的阶段都会被执行。这样大大简化了 Maven命令的输入。 这3种生命周期相互独立。当用户调用clean命令时,清理前和清理阶段会顺序执 行,但不会影响Default生命周期的任何阶段。 5.1.6Maven常用命令 Maven常用命令简要介绍如下。 mvnarchetype:generate:创建Maven项目。 mvnclean:清除项目目录中的生成结果。 mvncompile:编译项目源代码。 mvnpackage:将项目打包。 mvninstall:将项目的jar包安装在本地仓库中。 mvndeploy:发布项目。 mvntest-cile:编译测试源代码。 omp mvntest:运行应用程序中的单元测试 。 mvnsite:生成项目相关信息的站点 。 mvneclipse:生成Eclipse项目文件 。 mvnjety:启动Jety服务 。 mvntomcat:启动Tomcat服务 。 ..5.2 Maven 插件 5.1 vn插件框架 2.Mae Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有任务 都交给插件完成。Maven本地插件库如图5. 2所示。 例如,编译源代码是由maven-compiler-plugin插件完成的。 进一步说,每个任务对应一个插件目标(goal),每个插件会有一个或者多个目标。 例如,maven-compiler-plugin插件的compile目标用来编译位于src\main\java目录 下的主源代码,e目标用来编译位于sa目录下的测试源代码。 testCompilrc\test\jav 5.2 与生命周期有关的插件 2. Maven内置与生命周期有关的插件。3种生命周期各阶段与插件目标的绑定关系如 表5.5所示。 3至表5. 第5章深入Maven构建工具75 图5.n本地插件库 2 Mave 表5.n生命周期各阶段与插件目标的绑定关系 3 Clea 阶段插件目标 清理前 清理maven-clean-plugin:clean 清理后 表5.t生命周期各阶段与插件目标的绑定关系及任务 4 Defaul 阶段插件目标任务 处理资源文件maven-resources-plugin:resources 复制主资源文件至主输出目录 编译maven-compile-plugin:compile 编译主源代码至主输出目录 处理测试资源文件maven-resources-plugin:testRresources 复制测试资源文件至测试输出目录 编译测试源代码maven-compiler-plugin:testCompile 编译测试源代码至测试输出目录 测试maven-surefire-plugin:test 执行测试用例 打包maven-jar-plugin:jar 创建项目jar包 安装maven-instal-plugin:instal 将项目输出构件安装到本地仓库 部署maven-deploy-plugin:deploy 将项目输出构件部署到远程仓库 76 轻量级JavaEE Web框架技术———SpringMVC+Spring+MyBatis+SpringBoot 表5.5 Site生命周期各阶段与插件目标的绑定关系 阶 段插件目标 生成站点前 生成站点 maven-site-plugin:site 生成站点后 站点部署 maven-site-plugin:deploy 5.2.3 插件调用方式 用户可以通过两种方式调用Maven插件目标。 (1)直接在命令行指定要执行的插件及插件目标。 例如,mvnarchetype:generate就表示调用maven-archetype-plugin插件的generate 目标,这种带冒号的调用方式与生命周期无关。在4.2 节中就是用mvnarchetype: generate创建Java项目骨架: mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=helloapp - DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false (2)将插件目标与生命周期中的阶段绑定。这样,用户在命令行只需要输入生命周 期阶段即可。 例如,Maven默认将maven-compiler-plugin插件的compile目标与Default生命周 期的编译阶段绑定。因此,命令mvncompile实际上是先定位到Default生命周期的编译 阶段,然后再根据绑定关系调用maven-compiler-plugin插件的compile目标。 在4.6节中编译Java项目就是在命令行只输入生命周期的阶段来调用插件的: mvn compile 5.2.4 插件调用方式的差异 生命周期的具体阶段绑定的插件调用(例如mvnpackage)与直接执行插件及插件目 标(例如mvnjar:jarpackage绑定maven-jar-plugin:jar)效果是不一样的。 mvnjar只执行打包这一步。 mvnpackage不仅执行maven-jar-plugin:jar打包这一步,而且执行Default生命周 期中打包阶段之前的所有阶段。 1.直接调用插件打包 用maven-jar-plugin:2.4:jar插件(命令为mvnjar:jar)进行打包,输出结果如图5.3 所示。从图5.3可以看出,mvnjar:jar仅仅执行了maven-jar-plugin:2.4:jar(default-cli) @ helloapp打包插件进行打包。 第5章 深入Maven构建工具 77 图5.3 直接调用插件打包的输出结果 2.用生命周期方式调用插件 用生命周期方式调用插件进行打包使用mvnpackage命令,输出结果如图5.4所示。 图5.4 用生命周期方式调用插件打包的输出结果 输出的完整信息如下: [INFO] Scanning for projects... [INFO] ----------------< com.mycompany.app:helloapp >--------------- [INFO] Building helloapp 1.0-SNAPSHOT [INFO] -------------------------[ jar ]-------------------------- [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ helloapp - [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory e:\JavaWebBook\helloapp\src\main \resources 78 轻量级JavaEE Web框架技术———SpringMVC+Spring+MyBatis+SpringBoot [INFO] [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ helloapp --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ helloapp --- [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent! [INFO] skip non existing resourceDirectory e:\JavaWebBook\helloapp\src\test \resources [INFO] [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ helloapp --- [INFO] Nothing to compile - all classes are up to date [INFO] [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ helloapp --- [INFO] Surefire report directory: e: \ JavaWebBook \ helloapp \ target \ surefire -reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running com.mycompany.app.AppTest Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.004 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ helloapp --- [INFO] -------------------------------------------------------- [INFO] BUILD SUCCESS [INFO] -------------------------------------------------------- [INFO] Total time: 1.680 s [INFO] Finished at: 2019-08-30T21:05:03+08:00 [INFO] -------------------------------------------------------- 可以看出,mvnpackage 不仅执行了maven-jar-plugin:2.4:jar (default-cli)@ helloapp打包插件进行打包,还执行了Default生命周期中打包阶段之前的几个阶段的插 件。执行的插件如下: maven-resources-plugin:2.6:resources maven-compiler-plugin:3.1:compile maven-resources-plugin:2.6:testResources maven-compiler-plugin:3.1:testCompile maven-surefire-plugin:2.12.4:test maven-jar-plugin:2.4:jar 第5章 深入Maven构建工具 79 5.2.5 插件的配置 插件都有默认配置。当默认配置不满足需求时,需要在pom.xml中添加相应插件的 配置信息。例如,指定编译JDK版本为1.8,在配置标签中配置如下: org.apache.maven.plugins maven-compiler-plugin 3.7.0 1.8 1.8 UTF-8 5.2.6 绑定生命周期与插件目标 生命周期大部分阶段都有默认绑定的插件目标,当默认的绑定不满足要求时,可以通 过配置标签实现新的绑定。 在内由子标签 实现绑定配置,子标签 表示生命周期的阶段,子标签表示要绑定的插件目标。 下面的实例表示生命周期的打包阶段与maven-assembly-plugin插件的single目标 绑定: maven-assembly-plugin com.mycompany.app.App jar-with-dependencies 80 轻量级JavaEE Web框架技术———SpringMVC+Spring+MyBatis+SpringBoot make-assembly package single .. 5.3 Maven构建配置 5.3.1 标签 构建配置在标签内,插件配置标签属于标签的子标签, 标签是整个Maven构建配置标签,主要用于编译、打包、部署配置。 标签、标签、标签的关系如下: ${project.artifactId} src/main/resources true org.apache.maven.plugins maven-compiler-plugin 3.7.0 1.8 1.8 UTF-8