3.Maven 生命周期与模块化

1,生命周期
阶段处理描述
验证 validate验证项目验证项目是否正确且所有必须信息是可用的
编译 compile执行编译源代码编译在此阶段完成
测试 Test测试使用适当的单元测试框架(例如JUnit)运行测试。
包装 package打包创建JAR/WAR包如在 pom.xml 中定义提及的包
检查 verify检查对集成测试的结果进行检查,以保证质量达标
安装 install安装安装打包的项目到本地仓库,以供其他项目使用
部署 deploy部署拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程
1.1 Clean 生命周期

当我们执行 mvn post-clean 命令时,Maven 调用 clean 生命周期,它包含以下阶段:

阶段说明
pre-clean执行清理前需要完成的工作
clean清理上一次构建生成的文件
post-clean执行清理后需要完成的工作

mvn clean 中的 clean 就是上面的 clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,如果执行 mvn clean 将运行以下两个生命周期阶段:

pre-clean, clean

如果我们运行 mvn post-clean ,则运行以下三个生命周期阶段:

pre-clean, clean, post-clean

我们可以通过在上面的 clean 生命周期的任何阶段定义目标来修改这部分的操作行为。

1.2 Default 生命周期

这是 Maven 的主要生命周期,被用于构建应用,包括下面的 23 个阶段:

生命周期阶段描述
validate(校验)校验项目是否正确并且所有必要的信息可以完成项目的构建过程。
initialize(初始化)初始化构建状态,比如设置属性值。
generate-sources(生成源代码)生成包含在编译阶段中的任何源代码。
process-sources(处理源代码)处理源代码,比如说,过滤任意值。
generate-resources(生成资源文件)生成将会包含在项目包中的资源文件。
process-resources (处理资源文件)复制和处理资源到目标目录,为打包阶段最好准备。
compile(编译)编译项目的源代码。
process-classes(处理类文件)处理编译生成的文件,比如说对Java class文件做字节码改善优化。
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(部署)将最终的项目包复制到远程仓库中与其他开发者和项目共享。
1.3 Site 生命周期

Maven Site 插件一般用来创建新的报告文档、部署站点等。

阶段说明
pre-site执行一些需要在生成站点文档之前完成的工作
site生成项目的站点文档
post-site执行一些需要在生成站点文档之后完成的工作,并且为部署做准备
site-deploy将生成的站点文档部署到特定的服务器上
1.3.1 执行阶段命令

​ 1,可以选择某个生命周期的某个阶段执行,例如:

mvn package

​ 这里选择了 Default 生命周期的 package(打包)阶段来执行,需要注意的是,如果选择某个阶段来执行,那么在这个阶段之前的所有阶段都会先执行。

​ 2,也可以选择不同生命周期的阶段来混合执行,例如:

mvn clean package

​ 这里选择了 Clean 周期的 clean 阶段以及 Default 周期的 package 阶段来混合执行,同时这两个阶段之前的所有阶段都会被执行。

1.3.2 插件

​ 当执行 mvn compile(执行编译阶段),与之对应的是 mvn-compiler-plugin插件来完成这个阶段的工作。当执行 mvn test(执行测试阶段),对应的是 mvn-surefire-plugin 这个插件来完成这个阶段的工作。

​ 插件一样也是以项目的形式保存在仓库中,默认的中央仓库就保存了大量的插件库。当我们第一次使用Maven构建时,会从远程仓库下载到我们的本地仓库中,位于本地仓库的 org/apache/maven/plugins 目录下。

插件类型

Maven 提供了下面两种类型的插件:

类型描述
Build plugins在构建时执行,并在 pom.xml 的 元素中配置。
Reporting plugins在网站生成过程中执行,并在 pom.xml 的 元素中配置。

下面是一些常用插件的列表:

插件描述
clean构建之后清理目标文件。删除目标目录。
compiler编译 Java 源文件。
surefile运行 JUnit 单元测试。创建测试报告。
jar从当前工程中构建 JAR 文件。
war从当前工程中构建 WAR 文件。
javadoc为工程生成 Javadoc。
antrun从构建过程的任意一个阶段中运行一个 ant 任务的集合。

上面的例子展示了以下关键概念:

  • 插件是在 pom.xml 中使用 plugins 元素定义的。
  • 每个插件可以有多个目标。
  • 你可以定义阶段,插件会使用它的 phase 元素开始处理。我们已经使用了 clean 阶段。
  • 你可以通过绑定到插件的目标的方式来配置要执行的任务。我们已经绑定了 echo 任务到 maven-antrun-plugin 的 run 目标。
  • 就是这样,Maven 将处理剩下的事情。它将下载本地仓库中获取不到的插件,并开始处理。
<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>9.4.5.v20170502</version>
    <configuration>
        <scanIntervalSeconds>3</scanIntervalSeconds>
        <webAppSourceDirector>web</webAppSourceDirector>
        <webAppConfig>
            <contextPath>/</contextPath>
            <httpConnector>
                <port>8080</port>
            </httpConnector>
        </webAppConfig>
    </configuration>
</plugin>
2,模块化

​ 目前越来越多的项目采用模块化开发,通过合理的模块拆分,实现代码的复用性,便于维护和管理。Maven多模块项目,适用于一些比较大的项目,通过合理的模块拆分,实现代码的复用,便于维护和管理。尤其是一些开源框架,也是采用多模块的方式,提供插件集成,用户可以根据需要配置指定的模块。

项目结构如下:

test-hd-parent   (父级)
     —pom.xml
     —test-hd-api     (第三方接口层)
       ----pom.xml
      —test-hd-foundation (基础工具层)
       ----pom.xml
     —test-hd-resource  (资源层)
      ----pom.xml
     —test-hd-service    (逻辑业务层)
       ----pom.xml
      —test-hd-modules    (web层)
      ----pom.xml
          —test-hd-www      (web模块1)
         ----pom.xml
          —test-hd-admin      (web模块2)
         ----pom.xml

2.1 继承

​ 面向对象的思想中继承是为了提取共性,避免重复。而Maven的继承也是如此,将所有子模块共性的配置都可以统一放到父模块的pom文件中进行配置,不需要在每个子模块都配置一遍,这也是基于面向对象的思想。(注意:父模块的pom.xml文件中的packaging必须设置为pom,即文档对象模型)

2.2 聚合

​ 所谓聚合,就是把多个模块或项目聚合在一起。可以在父模块中聚合所有的子模块,只需要在父模块的pom文件中将所有的子模块配置在中,中的每个分别制定各个子模块的名称。

​ 使用聚合的好处是当构建整个项目的时候,不需要为每个子模块分别都构建一次,只需要在父模块(相当于整个项目)执行一次构建命令即可,此时会将所有的子模块一并进行构建。

2.3 按需依赖

​ 有时候并不是所有子模块都需要继承父类全部的依赖配置,不同的子模块可以根据需要分别继承不同的依赖配置,这时我们就可以在父模块中使用来管理所有依赖配置。(注:子模块在依赖时只需要指定groupId和artifactId即可,不需要指定版本号)

2.4 依赖子模块

​ 通常项目划分多个子模块之后,某些子模块需要使用其他模块的类来完成相关的逻辑处理。

pom属性说明
${project.build.directory}表示主源码路径,缺省为target
${project.build.outputDirectory}构建过程输出目录,缺省为target/class
${project.build.sourceEncoding}表示主源码的编码格式
${project.build.sourceDirectory}表示主源码的路径
${project.build.finalName}表示输出文件名称
${project.packaging}打包类型,缺省为jar
${project.version}表示项目版本
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值