美文网首页程序员
Maven - 构建生命周期

Maven - 构建生命周期

作者: 欧余山南 | 来源:发表于2017-10-18 16:58 被阅读0次

    什么是构建生命周期

    阶段 处理 描述
    准备资源 资源复制 资源复制可以进行定制
    编译 compile 执行编译 源代码编译在此阶段完成
    包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
    安装 install 安装 这一阶段在本地/远程Maven仓库安装程序包

    Maven的构建过程被分解为构建生命周期、阶段和目标。一个构建周期由一系列的构建阶段组成,每一个构建阶段由一系列的目标组成。当你运行Maven的时候,你会传入一条命令。这条命令就是构建生命周期、阶段或目标的名字。如果执行一个生命周期,该生命周期内的所有构建阶段都会被执行。如果执行一个构建阶段,在预定义的构建阶段中,所有处于当前构建阶段之前的阶段也都会被执行。
    一个典型的 Maven 构建生命周期是由下列顺序的阶段:

    阶段 处理 描述
    准备资源 资源复制 资源复制可以进行定制
    编译 compile 执行编译 源代码编译在此阶段完成
    包装 package 打包 创建JAR/WAR包如在 pom.xml 中定义提及的包
    安装 install 安装 这一阶段在本地/远程Maven仓库安装程序包

    Maven 的内部有三个构建生命周期,分别是 clean, default, site。其中 default 生命周期包含有23个阶段,其核心阶段如下所示:

    生命周期阶段 描述
    validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
    compile 编译工程源码。
    test 使用适当的单元测试框架(例如JUnit)运行测试。
    package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
    verify 运行检查操作来验证工程包是有效的,并满足质量要求。
    install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
    deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。
    生命周期主要阶段
    生命周期阶段 描述
    validate 检查工程配置是否正确,完成构建过程的所有必要信息是否能够获取到。
    compile 编译工程源码。
    test 使用适当的单元测试框架(例如JUnit)运行测试。
    package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
    verify 运行检查操作来验证工程包是有效的,并满足质量要求。
    install 安装工程包到本地仓库中,该仓库可以作为本地其他工程的依赖。
    deploy 拷贝最终的工程包到远程仓库中,以共享给其他开发人员和工程。

    当一个阶段通过 Maven 命令调用时,例如 mvn compile,只有该阶段之前以及包括该阶段在内的所有阶段会被执行。
    不同的 maven 目标将根据打包的类型(JAR / WAR / EAR),被绑定到不同的 Maven 生命周期阶段。
    可以指定多个不同构建生命周期的阶段,执行 mvn clean deploy 命令,首先完成的 clean lifecycle,将以前构建的文件清理,然后再执行 default lifecycle 的 validate, compile, test, package, verify, insstall, deploy 阶段,将 package 阶段创建的包发布到远程仓库中。

    阶段与插件的关系

    Maven 将构建过程定义为 default lifecycle,并将 default lifecycle 划分为一个个的阶段 phase,这一系列 phase 仅仅是规定执行顺序,每个阶段做什么工作?有谁来做,是由插件(plugins)来处理的。
    一个插件可以支持多种功能,称之为目标(goal),例如:compiler 插件有两个目标:compile 和 testCompile,分别实现编译源代码 和 编译测试代码。
    通过将插件的目标(goal)与 build lifecycle 中 phase 绑定到一起,这样,当要执行某个 phase 时,就调用插件来完成绑定的目标。
    从图中可以看出,每一个阶段可以绑定0 个 或 多个目标,每个插件可以提供 1 个或多个目标。

    阶段与插件关系图

    如何为工程创建构建生命周期

    阶段 目标
    process-resources resources:resources
    compile compiler:compile
    process-test-resources resources:testResources
    test-compile compiler:testCompile
    test surefire:test
    package jar:jar
    install install:install
    deploy deploy:deploy

    例如设置不同的packaging类型:在 pom.xml 文件中,packaging 类型支持 jar, war, ear, pom 等多种类型,不同的 packaging 类型会使得不同的 phase 绑定不同的 plugin goal。下面是 packaging 类型为 jar 时,phase 与 plugin goal 的映射关系。

    阶段 目标
    process-resources resources:resources
    compile compiler:compile
    process-test-resources resources:testResources
    test-compile compiler:testCompile
    test surefire:test
    package jar:jar
    install install:install
    deploy deploy:deploy

    配置插件

    在 pom.xml 文件中, <build> <plugins> 元素下可以添加 <plugin>,通过指定 goal 和 phase 来进行绑定。
    例如:将插件 modello-maven-plugin 的 java 目标绑定到 generate-sources 阶段。

    <plugin>
    <groupId>org.codehaus.modello</groupId>
    <artifactId>modello-maven-plugin</artifactId>
    <version>1.8.1</version>
    <executions>
    <execution>
    <configuration>
    <models>
    <model>src/main/mdo/maven.mdo</model>
    </models>
    <version>4.0.0</version>
    </configuration>
    <phase>generate-sources</phase>
    <goals>
    <goal>java</goal>
    </goals>
    </execution>
    </executions>
    </plugin>

    没有配置任何插件的情况下,maven会使用自己默认的配置插件:
    没有配置任何 plugin 的 pom.xml,执行 mvn install 的输出日志,从日志中可以看到 一系列的 插件(plugin):版本号:目标(phase),例如

    maven-resources-plugin:2.6:resources (default-resources),maven-compiler-plugin:3.1:compile (default-compile) ,
    maven-resources-plugin:2.6:testResources (default-testResources),maven-compiler-plugin:3.1:testCompile (default-testCompile),
    maven-surefire-plugin:2.12.4:test (default-test),
    maven-jar-plugin:2.4:jar (default-jar) ,
    maven-install-plugin:2.4:install (default-install)。

    相关文章

      网友评论

        本文标题:Maven - 构建生命周期

        本文链接:https://www.haomeiwen.com/subject/dnreuxtx.html