ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Maven基础知识(3)- Maven 生命周期

2022-06-06 00:05:08  阅读:224  来源: 互联网

标签:INFO maven 生命周期 plugin site 基础知识 Maven clean


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

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

 

1. Maven 三套标准的生命周期

    1) clean 生命周期

        clean 生命周期用于清理项目,包括以下 3 个阶段。

            (1) pre-clean(清理前);
            (2) clean(清理);
            (3) post-clean(清理后);

    2) default (或称 build) 生命周期

        用于构建项目 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 拷贝最终的包文件到远程仓库中,以共享给其他开发人员和项目。


    3) site 生命周期

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

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

            (1) pre-site
            (2) site
            (3) post-site
            (4) site-deploy


2. 生命周期与插件的关系

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

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

 1         package com.example;
 2 
 3         public abstract class LifeCycle {
 4             // 定义构建过程
 5             public void build() {
 6                 // 模拟生命周期各个阶段,即调用插件中目标
 7                 clean();
 8                 init();
 9                 compile();
10                 package();
11                 install();
12             }
13             // 定义清理的过程
14             public abstract void clean();
15             // 定义初始化的过程
16             public abstract void init();
17             // 定义编译的过程
18             public abstract void compile();
19             // 定义打包的过程
20             public abstract void package();
21             // 定义安装的过程
22             public abstract void install();
23         }

 

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

1         package com.example;
2 
3         public abstract class CleanPlugin extends LifeCycle {
4 
5             @Override
6             public void clean() {
7                 System.out.println("clean");
8             }
9         }

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

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

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


3. 示例

    在 “Maven基础知识(1)- Maven 简介、Maven 安装配置、创建 Maven 项目、构建&测试项目” 里 MavenDemo01 项目基础上,使用 maven-antrun-plugin 插件的 run 目标绑定到 Maven 生命周期的各阶段,显示自定义文本信息。
    
    1) 修改 pom.xml

  1         <project xmlns="http://maven.apache.org/POM/4.0.0"
  2                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3                 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
  4                                     http://maven.apache.org/maven-v4_0_0.xsd">
  5 
  6             <modelVersion>4.0.0</modelVersion>
  7             <groupId>com.example</groupId>
  8             <artifactId>MavenDemo01</artifactId>
  9             <packaging>jar</packaging>
 10             <version>1.0-SNAPSHOT</version>
 11             <name>MavenDemo01</name>
 12             <url>http://maven.apache.org</url>
 13             <dependencies>
 14                 <dependency>
 15                     <groupId>junit</groupId>
 16                     <artifactId>junit</artifactId>
 17                     <version>3.8.1</version>
 18                     <scope>test</scope>
 19                 </dependency>
 20             </dependencies>
 21 
 22             <build>
 23                 <plugins>
 24                     <!-- site 生命周期相关插件,其它生命周期不需要 -->
 25                     <plugin>
 26                         <groupId>org.apache.maven.plugins</groupId>
 27                         <artifactId>maven-site-plugin</artifactId>
 28                         <version>3.8.2</version>
 29                     </plugin>
 30 
 31                     <!-- 添加插件 maven-antrun-plugin -->
 32                     <plugin>
 33                         <groupId>org.apache.maven.plugins</groupId>
 34                         <artifactId>maven-antrun-plugin</artifactId>
 35                         <version>1.8</version>
 36                         <executions>
 37                             <!-- clean 生命周期 -->
 38                             <execution>
 39                                 <!-- pre-clean 自定义输出信息 -->
 40                                 <id>com.example pre-clean</id>
 41                                 <phase>pre-clean</phase>
 42                                 <goals>
 43                                     <goal>run</goal>
 44                                 </goals>
 45                                 <configuration>
 46                                     <tasks>
 47                                         <echo>Maven clean lifecycle -> pre-clean: 自定义输出信息</echo>
 48                                     </tasks>
 49                                 </configuration>
 50                             </execution>
 51                             <execution>
 52                                 <!-- clean 自定义输出信息 -->
 53                                 <id>com.example clean</id>
 54                                 <phase>clean</phase>
 55                                 <goals>
 56                                     <goal>run</goal>
 57                                 </goals>
 58                                 <configuration>
 59                                     <tasks>
 60                                         <echo>Maven clean lifecycle -> clean: 自定义输出信息</echo>
 61                                     </tasks>
 62                                 </configuration>
 63                             </execution>
 64                             <execution>
 65                                 <!-- post-clean 自定义输出信息 -->
 66                                 <id>com.example post-clean</id>
 67                                 <phase>post-clean</phase>
 68                                 <goals>
 69                                     <goal>run</goal>
 70                                 </goals>
 71                                 <configuration>
 72                                     <tasks>
 73                                         <echo>Maven clean lifecycle -> post-clean: 自定义输出信息</echo>
 74                                     </tasks>
 75                                 </configuration>
 76                             </execution>
 77 
 78                             <!-- default 生命周期 -->
 79                             <execution>
 80                                 <!-- validate 自定义输出信息 -->
 81                                 <id>com.example validate</id>
 82                                 <phase>validate</phase>
 83                                 <goals>
 84                                     <goal>run</goal>
 85                                 </goals>
 86                                 <configuration>
 87                                     <tasks>
 88                                         <echo>Maven default lifecycle -> validate: 自定义输出信息</echo>
 89                                     </tasks>
 90                                 </configuration>
 91                             </execution>
 92                             <execution>
 93                                 <!-- compile 自定义输出信息 -->
 94                                 <id>com.example compile</id>
 95                                 <phase>compile</phase>
 96                                 <goals>
 97                                     <goal>run</goal>
 98                                 </goals>
 99                                 <configuration>
100                                     <tasks>
101                                         <echo>Maven default lifecycle -> compile: 自定义输出信息</echo>
102                                     </tasks>
103                                 </configuration>
104                             </execution>
105                             <execution>
106                                 <!-- test 自定义输出信息 -->
107                                 <id>com.example test</id>
108                                 <phase>test</phase>
109                                 <goals>
110                                     <goal>run</goal>
111                                 </goals>
112                                 <configuration>
113                                     <tasks>
114                                         <echo>Maven default lifecycle -> test: 自定义输出信息</echo>
115                                     </tasks>
116                                 </configuration>
117                             </execution>
118                             <execution>
119                                 <!-- package 自定义输出信息 -->
120                                 <id>com.example package</id>
121                                 <phase>package</phase>
122                                 <goals>
123                                     <goal>run</goal>
124                                 </goals>
125                                 <configuration>
126                                     <tasks>
127                                         <echo>Maven default lifecycle -> package: 自定义输出信息</echo>
128                                     </tasks>
129                                 </configuration>
130                             </execution>
131                             <execution>
132                                 <!-- deploy 自定义输出信息 -->
133                                 <id>com.example deploy</id>
134                                 <phase>deploy</phase>
135                                 <goals>
136                                     <goal>run</goal>
137                                 </goals>
138                                 <configuration>
139                                     <tasks>
140                                         <echo>Maven default lifecycle -> deploy: 自定义输出信息</echo>
141                                     </tasks>
142                                 </configuration>
143                             </execution>
144 
145                             <!-- site 生命周期 -->
146                             <execution>
147                                 <!-- pre-site 自定义输出信息 -->
148                                 <id>com.example pre-site</id>
149                                 <phase>pre-site</phase>
150                                 <goals>
151                                     <goal>run</goal>
152                                 </goals>
153                                 <configuration>
154                                     <tasks>
155                                         <echo>Maven site lifecycle -> pre-site: 自定义输出信息</echo>
156                                     </tasks>
157                                 </configuration>
158                             </execution>
159                             <execution>
160                                 <!-- site 自定义输出信息 -->
161                                 <id>com.example site</id>
162                                 <phase>site</phase>
163                                 <goals>
164                                     <goal>run</goal>
165                                 </goals>
166                                 <configuration>
167                                     <tasks>
168                                         <echo>Maven site lifecycle -> site: 自定义输出信息</echo>
169                                     </tasks>
170                                 </configuration>
171                             </execution>
172                             <execution>
173                                 <!-- post-site 自定义输出信息 -->
174                                 <id>com.example post-site</id>
175                                 <phase>post-site</phase>
176                                 <goals>
177                                     <goal>run</goal>
178                                 </goals>
179                                 <configuration>
180                                     <tasks>
181                                             <echo>Maven site lifecycle -> post-site: 自定义输出信息</echo>
182                                     </tasks>
183                                 </configuration>
184                             </execution>
185                             <execution>
186                                 <!-- site-deploy 自定义输出信息 -->
187                                 <id>com.example site-deploy</id>
188                                 <phase>site-deploy</phase>
189                                 <goals>
190                                     <goal>run</goal>
191                                 </goals>
192                                 <configuration>
193                                     <tasks>
194                                             <echo>Maven site lifecycle -> site-deploy: 自定义输出信息</echo>
195                                     </tasks>
196                                 </configuration>
197                             </execution>
198 
199                         </executions>
200                     </plugin>
201                 </plugins>
202             </build>                
203         </project>


        打开 cmd 命令行窗口,进入 D:\Workshop\maven\MavenDemo01 目录。

    2) 测试 clean 生命周期

       执行如下命令:

            D:\Workshop\maven\MavenDemo01>mvn post-clean

        输出结果如下:

            [INFO] Scanning for projects...
            [INFO]
            [INFO] ----------------------< com.example:MavenDemo01 >-----------------------
            [INFO] Building MavenDemo01 1.0-SNAPSHOT
            [INFO] --------------------------------[ jar ]---------------------------------
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example pre-clean) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven clean lifecycle -> pre-clean: 自定义输出信息
            [INFO] Executed tasks
            [INFO]
            [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ MavenDemo01 ---
            [INFO] Deleting D:\Workshop\maven\MavenDemo01\target
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example clean) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven clean lifecycle -> clean: 自定义输出信息
            [INFO] Executed tasks
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example post-clean) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven clean lifecycle -> post-clean: 自定义输出信息
            [INFO] Executed tasks
            [INFO] ------------------------------------------------------------------------
            [INFO] BUILD SUCCESS
            [INFO] ------------------------------------------------------------------------
            [INFO] Total time:  0.627 s
            [INFO] Finished at: 2022-06-05T20:17:36+08:00
            [INFO] ------------------------------------------------------------------------


    3) 测试 default 生命周期

        执行如下命令:

            D:\Workshop\maven\MavenDemo01>mvn compile

        输出结果如下:

            [INFO] Scanning for projects...
            [INFO]
            [INFO] ----------------------< com.example:MavenDemo01 >-----------------------
            [INFO] Building MavenDemo01 1.0-SNAPSHOT
            [INFO] --------------------------------[ jar ]---------------------------------
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example validate) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven default lifecycle -> validate: 自定义输出信息
            [INFO] Executed tasks
            [INFO]
            [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ MavenDemo01 ---
            [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform dependent!
            [INFO] skip non existing resourceDirectory D:\Workshop\maven\MavenDemo01\src\main\resources
            [INFO]
            [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ MavenDemo01 ---
            [INFO] Changes detected - recompiling the module!
            [WARNING] File encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
            [INFO] Compiling 2 source files to D:\Workshop\maven\MavenDemo01\target\classes
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example compile) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven default lifecycle -> compile: 自定义输出信息
            [INFO] Executed tasks
            [INFO] ------------------------------------------------------------------------
            [INFO] BUILD SUCCESS
            [INFO] ------------------------------------------------------------------------
            [INFO] Total time:  1.177 s
            [INFO] Finished at: 2022-06-05T20:18:49+08:00
            [INFO] ------------------------------------------------------------------------


    4) 测试 site 生命周期

        执行如下命令:

            D:\Workshop\maven\MavenDemo01>mvn site

        输出结果如下:

            [INFO] Scanning for projects...
            [INFO]
            [INFO] ----------------------< com.example:MavenDemo01 >-----------------------
            [INFO] Building MavenDemo01 1.0-SNAPSHOT
            [INFO] --------------------------------[ jar ]---------------------------------
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example pre-site) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven site lifecycle -> pre-site: 自定义输出信息
            [INFO] Executed tasks
            [INFO]
            [INFO] --- maven-site-plugin:3.8.2:site (default-site) @ MavenDemo01 ---
            [WARNING] Input file encoding has not been set, using platform encoding GBK, i.e. build is platform dependent!
            [WARNING] Report plugin org.apache.maven.plugins:maven-project-info-reports-plugin has an empty version.
            [WARNING]
            [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
            [WARNING]
            [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
            [INFO] configuring report plugin org.apache.maven.plugins:maven-project-info-reports-plugin:3.3.0
            [INFO] 15 reports detected for maven-project-info-reports-plugin:3.3.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)
            [INFO] Relativizing decoration links with respect to localized project URL: http://maven.apache.org
            [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.3.0:dependencies
            [INFO] Generating "Dependency Information" report --- maven-project-info-reports-plugin:3.3.0:dependency-info
            [INFO] Generating "About" report         --- maven-project-info-reports-plugin:3.3.0:index
            [INFO] Generating "Plugin Management" report --- maven-project-info-reports-plugin:3.3.0:plugin-management
            [INFO] Generating "Plugins" report       --- maven-project-info-reports-plugin:3.3.0:plugins
            [INFO] Generating "Summary" report       --- maven-project-info-reports-plugin:3.3.0:summary
            [INFO]
            [INFO] --- maven-antrun-plugin:1.8:run (com.example site) @ MavenDemo01 ---
            [WARNING] Parameter tasks is deprecated, use target instead
            [INFO] Executing tasks

            main:
                [echo] Maven site lifecycle -> site: 自定义输出信息
            [INFO] Executed tasks
            [INFO] ------------------------------------------------------------------------
            [INFO] BUILD SUCCESS
            [INFO] ------------------------------------------------------------------------
            [INFO] Total time:  5.081 s
            [INFO] Finished at: 2022-06-05T20:19:45+08:00
            [INFO] ------------------------------------------------------------------------


        Maven 命令运行完毕后,可以在项目的 target\site 目录下找到 Maven 生成的站点文件,双击打开 index.html 查看站点。


标签:INFO,maven,生命周期,plugin,site,基础知识,Maven,clean
来源: https://www.cnblogs.com/tkuang/p/16345651.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有