zoukankan      html  css  js  c++  java
  • Maven生命周期

    在 Maven 出现之前,项目构建的生命周期就已经存在,开发人员每天都在对项目进行清理,编译,测试及部署,但由于没有统一的规范,不同公司甚至不同项目之间的构建的方式都不尽相同。

    Maven 从大量项目和构建工具中学习和反思,最后总结了一套高度完美的,易扩展的生命周期。这个生命周期将项目的清理、初始化、编译、测试、打包、集成测试、验证、部署和站点生成等几乎所有构建过程进行了抽象和统一。

    生命周期与插件的关系

    Maven 生命周期是抽象的,其本身不能做任何实际工作,这些实际工作(如源代码编译)都通过调用 Maven 插件 中的插件目标(plugin goal)完成的。

    为了更好的理解 Maven 生命周期、插件以及插件目标三者的关系,我们可以将 Maven 生命周期理解成一个抽象父类,将插件理解成其子类,将插件目标理解成子类中重写的方法,其基本结构与下面的示例代码相似。

    package net.biancheng.www;
    /**
    * 模拟 maven 生命周期
    */
    public abstract class LifeCycle {
        //定义构建过程
        public void build() {
            //模拟生命周期各个阶段,即调用插件中目标
            clean();
            initialize();
            compile();
            packager();
            install();
        }
        //定义清理的过程
        public abstract void clean();
        //定义初始化的过程
        public abstract void initialize();
        //定义编译的过程
        public abstract void compile();
        //定义打包的过程
        public abstract void packager();
        //定义安装的过程
        public abstract void install();
    }

    模拟 clean 插件的子类,代码如下。

    package net.biancheng.www;
    /**
    * 子类模拟clean 相关的插件
    */
    public abstract class CleanPlugin extends LifeCycle {
        //重写父类(生命周期)的清理工作
        //模拟插件目标
        @Override
        public void clean() {
            System.out.println("清理");
        }
    }

    以上示例中,父类 LifeCycle 模拟的是 Maven 生命周期,子类 CleanPlugin 模拟的是 Maven 插件,而子类中重写的 clean() 模拟的是插件目标。

    虽然示例中的代码与 Maven 实际代码相去甚远,但它们的基本理念是方法相同的。生命周期抽象了构建的各个步骤,定义了它们的执行顺序,但却没有提供具体的实现。插件中完成了对构建过程的实现,想要完成某个构建步骤,调用插件中的一个或多个插件目标即可。

    生命周期中的每个构建过程都可以绑定一个或多个插件目标,且 Maven 为大多数的构建步骤都绑定了默认的插件。例如,针对源代码编译的插件是 maven-compiler-plugin、针对集成测试的插件是 maven-surefire-plugin 等。

    注意:Maven 插件和插件目标了解即可,在后面的章节中会详细介绍。

    三套生命周期

    Maven 拥有三套标准的生命周期:

    • clean:用于清理项目
    • default:用于构建项目
    • site:用于建立项目站点

    构建阶段

    每套生命周期包含一系列的构建阶段(phase),这些阶段是有顺序的,且后面的阶段依赖于前面的阶段。用户与 Maven 最直接的交互方式就是调用这些生命周期阶段。以 clean 生命周期为例,它包含 pre-clean、clean 以及 post-clean 三个阶段,当用户调用 pre-clean 阶段时,则只有 pre-clean 阶段执行;当用户调用 clean 阶段时,pre-clean 和 clean 阶段都会执行。当用户调用 post-clean 阶段时,则 pre-clean、clean 以及 post-clean 三个阶段都会执行

    通过将阶段名传递给 mvn 命令,就可以调用构建阶段,例如:

    mvn install

    生命周期的独立性

    与构建阶段的前后依赖关系不同,三套生命周期本身时相互独立的,用户可以只调用 clean 生命周期的某个阶段,也可以只调用 default 生命周期的某个阶段,而不会对其他生命周期造成任何影响。 

    clean 生命周期

     clean 生命周期包括以下 3 个阶段。

    • pre-clean(清理前)
    • clean(清理)
    • post-clean(清理后)


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

    示例 1

    下面我们将 maven-antrun-plugin 插件的 run 目标绑定到 pre-clean、clean 和 post-clean 三个阶段中,以实现在 clean 生命周期的各个阶段中显示自定义文本信息,pom.xml 配置如下:

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>net.biancheng.www</groupId>
        <artifactId>maven</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <dependencies>
            <!-- junit依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
                <scope>compile</scope>
            </dependency>
            <!-- log4j依赖 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <!-- 添加插件 maven-antrun-plugin -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.1</version>
                    <executions>
                        <execution>
                            <!--自定义阶段 id -->
                            <id>www.biancheng.net pre-clean</id>
                            <!--阶段 -->
                            <phase>pre-clean</phase>
                            <!--目标 -->
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <!--配置 -->
                            <configuration>
                                <!-- 执行的任务 -->
                                <tasks>
                                    <!-- 输出自定义文本信息 -->
                                    <echo>预清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <!--自定义阶段 id -->
                            <id>www.biancheng.net clean</id>
                            <!--阶段 -->
                            <phase>clean</phase>
                            <!--目标 -->
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <!--配置 -->
                            <configuration>
                                <!-- 执行的任务 -->
                                <tasks>
                                    <!--自定义文本信息 -->
                                    <echo>清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <!--自定义阶段 id -->
                            <id>www.biancheng.net post-clean</id>
                            <!--阶段 -->
                            <phase>post-clean</phase>
                            <!-- 目标 -->
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <!--配置 -->
                            <configuration>
                                <!-- 执行的任务 -->
                                <tasks>
                                    <!-- 执行的任务 -->
                                    <echo>后清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net</echo>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

    打开命令行窗口,跳转到 pom.xml 所在的目录,执行命令mvn post-clean,结果如下。

    [INFO] Scanning for projects...
    [INFO]
    [INFO] ----------------------< net.biancheng.www:maven >-----------------------
    [INFO] Building maven 0.0.1-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net pre-clean) @ maven ---
    [INFO] Executing tasks
         [echo] 预清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ maven ---
    [INFO]
    [INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net clean) @ maven ---
    [INFO] Executing tasks
         [echo] 清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net post-clean) @ maven ---
    [INFO] Executing tasks
         [echo] 后清理阶段,编程帮 欢迎您的到来,网址:www.biancheng.net
    [INFO] Executed tasks
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.365 s
    [INFO] Finished at: 2021-03-01T13:25:07+08:00
    [INFO] ------------------------------------------------------------------------
    View Code

    default 生命周期

    default 生命周期定义了项目真正构建时所需要的所有步骤,它是所有生命周期中最核心,最重要的部分

    default 生命周期包含非常多的阶段,如下表。

    阶段描述
    validate 验证项目是否正确以及所有必要信息是否可用。
    initialize 初始化构建状态。
    generate-sources 生成编译阶段需要的所有源码文件。
    process-sources 处理源码文件,例如过滤某些值。
    generate-resources 生成项目打包阶段需要的资源文件。
    process-resources 处理资源文件,并复制到输出目录,为打包阶段做准备。
    compile 编译源代码,并移动到输出目录。
    process-classes 处理编译生成的字节码文件
    generate-test-sources 生成编译阶段需要的测试源代码。
    process-test-sources 处理测试资源,并复制到测试输出目录。
    test-compile 编译测试源代码并移动到测试输出目录中。
    test 使用适当的单元测试框架(例如 JUnit)运行测试。
    prepare-package 在真正打包之前,执行一些必要的操作。
    package 获取编译后的代码,并按照可发布的格式进行打包,例如 JAR、WAR 或者 EAR 文件。
    pre-integration-test 在集成测试执行之前,执行所需的操作,例如设置环境变量。
    integration-test 处理和部署所需的包到集成测试能够运行的环境中。
    post-integration-test 在集成测试被执行后执行必要的操作,例如清理环境。
    verify 对集成测试的结果进行检查,以保证质量达标。
    install 安装打包的项目到本地仓库,以供其他项目使用。
    deploy 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。

    示例 2

    将 maven-antrun-plugin 插件的 run 目标绑定 default 生命周期的部分阶段中,以实现在 default 生命周期的特定阶段中显示定义文本信息。

    更新 D:maven 文件夹中的 pom.xml 文件,内容如下。

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>net.biancheng.www</groupId>
        <artifactId>maven</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <dependencies>
            <!-- junit依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
                <scope>compile</scope>
            </dependency>
            <!-- log4j依赖 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <!-- 添加插件 maven-antrun-plugin -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.1</version>
                    <executions>
                        <execution>
                            <id>www.biancheng.net validate</id>
                            <phase>validate</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 验证阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.biancheng.net compile</id>
                            <phase>compile</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 编译阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.biancheng.net test</id>
                            <phase>test</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 测试阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.biancheng.net package</id>
                            <phase>package</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 打包阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.biancheng.net deploy</id>
                            <phase>deploy</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net 部署阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

    打开命令行窗口,跳转到 pom.xml 所在的目录,执行命令:D:maven>mvn compile,结果如下。

    [INFO] Scanning for projects...
    [INFO]
    [INFO] ----------------------< net.biancheng.www:maven >-----------------------
    [INFO] Building maven 0.0.1-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net validate) @ maven ---
    [INFO] Executing tasks
         [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net 验证阶段……
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ maven ---
    [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
    [INFO] skip non existing resourceDirectory D:mavensrcmain
    esources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ maven ---
    [INFO] No sources to compile
    [INFO]
    [INFO] --- maven-antrun-plugin:1.1:run (www.biancheng.net compile) @ maven ---
    [INFO] Executing tasks
         [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net 编译阶段……
    [INFO] Executed tasks
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.652 s
    [INFO] Finished at: 2021-03-01T15:07:50+08:00
    [INFO] ------------------------------------------------------------------------
    View Code

    site 生命周期

    sit 生命周期的目的是建立和部署项目站点,Maven 能够根据 POM 包含的信息,自动生成一个友好的站点,该站点包含一些与该项目相关的文档。

    site 生命周期包含以下 4 个阶段:

    • pre-site
    • site
    • post-site
    • site-deploy


    下面我们将 maven-antrun-plugin 插件的 run 目标绑定到 site 生命周期的所有阶段中,以实现在该生命周期各个阶段显示自定义文本信息。

    更新 D:maven 目录下的 pom.xml 文件,内容如下。

    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <groupId>net.biancheng.www</groupId>
        <artifactId>maven</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <dependencies>
            <!-- junit依赖 -->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.9</version>
                <scope>compile</scope>
            </dependency>
            <!-- log4j依赖 -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
        </dependencies>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>3.7.1</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <!-- 添加插件 maven-antrun-plugin -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-antrun-plugin</artifactId>
                    <version>1.3</version>
                    <executions>
                        <execution>
                            <id>www.bianchengbang.net pre-site</id>
                            <phase>pre-site</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net pre-site 阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.bianchengbang.net site</id>
                            <phase>site</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net site 阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.bianchengbang.net post-site</id>
                            <phase>post-site</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net post-site 阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                        <execution>
                            <id>www.bianchengbang.net site-deploy</id>
                            <phase>site-deploy</phase>
                            <goals>
                                <goal>run</goal>
                            </goals>
                            <configuration>
                                <tasks>
                                    <echo>编程帮 欢迎您的到来,网址:www.biancheng.net site-deploy 阶段……</echo>
                                </tasks>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

    打开命令行窗口,跳转到 pom.xml 所在的目录,执行 mvn 命令:mvn post-site,结果如下。

    [INFO] Scanning for projects...
    [INFO]
    [INFO] ----------------------< net.biancheng.www:maven >-----------------------
    [INFO] Building maven 0.0.1-SNAPSHOT
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO]
    [INFO] --- maven-antrun-plugin:1.3:run (www.bianchengbang.net pre-site) @ maven ---
    [INFO] Executing tasks
         [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net pre-site 阶段……
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-site-plugin:3.7.1:site (default-site) @ maven ---
    [WARNING] Input file encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
    [INFO] configuring report plugin org.apache.maven.plugins:maven-project-info-reports-plugin:3.0.0
    [INFO] 15 reports detected for maven-project-info-reports-plugin:3.0.0: ci-management, dependencies, dependency-info, dependency-management, distribution-management, index, issue-management, licenses, mailing-lists, modules, plugin-management, plugins, scm, summary, team
    [INFO] Rendering site with default locale English (en)
    [WARNING] No project URL defined - decoration links will not be relativized!
    [INFO] Rendering content with org.apache.maven.skins:maven-default-skin:jar:1.2 skin.
    [INFO] Generating "Dependencies" report  --- maven-project-info-reports-plugin:3.0.0:dependencies
    [INFO] Generating "Dependency Information" report --- maven-project-info-reports-plugin:3.0.0:dependency-info
    [INFO] Generating "About" report         --- maven-project-info-reports-plugin:3.0.0:index
    [INFO] Generating "Plugin Management" report --- maven-project-info-reports-plugin:3.0.0:plugin-management
    [INFO] Generating "Plugins" report       --- maven-project-info-reports-plugin:3.0.0:plugins
    [INFO] Generating "Summary" report       --- maven-project-info-reports-plugin:3.0.0:summary
    [INFO]
    [INFO] --- maven-antrun-plugin:1.3:run (www.bianchengbang.net site) @ maven ---
    [INFO] Executing tasks
         [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net site 阶段……
    [INFO] Executed tasks
    [INFO]
    [INFO] --- maven-antrun-plugin:1.3:run (www.bianchengbang.net post-site) @ maven ---
    [INFO] Executing tasks
         [echo] 编程帮 欢迎您的到来,网址:www.biancheng.net post-site 阶段……
    [INFO] Executed tasks
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.824 s
    [INFO] Finished at: 2021-03-01T16:02:44+08:00
    [INFO] ------------------------------------------------------------------------
    View Code
  • 相关阅读:
    POJ 1300 Open Door
    POJ 2230 Watchcow
    codevs 1028 花店橱窗布置
    codevs 1021 玛丽卡
    codevs 1519 过路费
    codevs 3287 货车运输
    codevs 3305 水果姐逛水果街二
    codevs 1036 商务旅行
    codevs 4605 LCA
    POJ 1330 Nearest Common Ancestors
  • 原文地址:https://www.cnblogs.com/cy0628/p/15033573.html
Copyright © 2011-2022 走看看