深入理解maven构建生命周期和各种plugin插件

欢迎关注鄙人公众号,技术干货随时看!
深入理解maven构建生命周期和各种plugin插件_第1张图片
技术交流qq群: 659201069

鄙人的新书《elasticsearch7完全开发指南》,欢迎订阅!

https://wenku.baidu.com/view/8ff2ce94591b6bd97f192279168884868762b8e7

《kibana权威指南》

https://wenku.baidu.com/view/24cfee1ce43a580216fc700abb68a98270feac21

本博文不会长篇大论的讨论生命周期的概念,而是从各种plugin的实际功能和应用出发,来讨论maven的实际应用,说得通透一点,生命周期(lifecycle)可以理解成由各种plugin按照一定的顺序执行来完成java项目清理、编译、打包、测试、布署等整个项目的流程的一个过程。
  生命周期(lifecycle)由各个阶段组成,每个阶段由maven的插件plugin来执行完成。生命周期(lifecycle)主要包括clean、resources、complie、install、package、testResources、testCompile等,其中带test开头的都是用业编译测试代码或运行单元测试用例的。

总揽生命周期(lifecycle)

一般构建项目时执行的最常用的命领是mvn clean install,如果是IDE就是点对应的按纽其实还是调的mvn命令,除非你使用的IDE内嵌的maven(不推荐使用内嵌的maven)。下周通过一个具体的实例来详细了解执行mvn clean install这条命令背后,maven为我们做了哪些事情。我们有一个工程,工程结构如下图所示,这个工程非常简单,只有两个类,Hello类和对应的测试类HelloWorldTest,
  深入理解maven构建生命周期和各种plugin插件_第2张图片

Hello类和对应的测试类HelloWorldTest,代码如下

package com.feiniu.bigdata.helloworld;

import com.feiniu.bigdata.hello.Hello;
import com.feiniu.bigdata.main.Main;
import junit.framework.TestCase;
import org.junit.Test;

public class HelloWorldTest {

    @Test
    public void testSayHello(){
        Hello hello = new Hello();
        String result = hello.sayHello();
        TestCase.assertEquals("Hello world",result);
    }
}
package com.feiniu.bigdata.hello;

public class Hello {
    public String sayHello() {
        return "Hello world";
    }
    public static void main(String[] args) {
        System.out.println(new Hello().sayHello());
    }
}

pom文件也很简单如下所示:



    4.0.0

    com.feiniu.bigdata
    fn.program
    1.0-SNAPSHOT
    jar
    fn program
    This is a program to tesc new function of jdk8

    
        
            
                org.apache.maven.plugins
                maven-compiler-plugin
                3.3
                
                    1.8
                    1.8
                
            
        
    

    
        
        
        
            junit
            junit
            4.12
            test
        

    

到项目根目录下执行mvn clean install  对应的输出如下图所示
深入理解maven构建生命周期和各种plugin插件_第3张图片深入理解maven构建生命周期和各种plugin插件_第4张图片

由上图可知,各个插件的执行顺序一般是:1:clean、2:resources、3:compile、4:testResources、5:testCompile、6:test、7:jar、8:install。在图中标记的地方每一行都是由冒号分隔的,前半部分是对应的插件,后半部分是插件的执行目标也就是插件执行产生的结果。现在我们来看下上面的pom文件,我们如配置了maven-compiler-plugin这个插件,其它的插件没有配置,但最后项目构建成功,说明maven内置的各种插件,如果pom中没有配置就调用默认的内置插件,如果pom中配置了就调用配置的插件。到此我们理解maven的构建过程或者有更多的人称是打包,就是由各种插件按照一定的顺序执行来完成项目的编译,单元测试、打包、布署的完成。各种插件的执行过程也就构成的maven的生命周期(lifecycle)。生命周期(lifecycle)各个阶段并不是独立的,可以单独执行如mvn clean,也可以一起执行如mvn clean install。而且有的mvn命令其是包括多个阶段的,如mvn compile其是包括了resources和compile两个阶段。下面分别来分析各个阶段需要的插件和输出的结果

clean插件maven-clean-plugin:2.5

clean阶段是独立的一个阶段,功能就是清除工程目前下的target目录,对应的插件是 maven-clean-plugin:2.5,2.5是版本号,可以使用maven内置的插件,当然也可以自己在pom中配置,配置方式和上面所说的maven-compiler-plugin配置方式一样。下面看下mvn执行前后工程目录下的输出对比
这里写图片描述这里写图片描述

resources插件maven-resources-plugin:2.6

resource插件的功能就是把项目需要的配置文件拷贝到指定的目当,默认是拷贝src\main\resources目录下的件到classes目录下,当然可以自己来配置源目录和输出目录。resources插件一般不单独执行,complie插件执行时会先调用resources插件。配置示例如下:

        
         org.apache.maven.plugins  
         maven-resources-plugin  
         2.6  
           
             
              copy-resources  
                
              validate  
                
                copy-resources  
                
                
                
                 ${project.build.outputDirectory}  
                    
                    
                    
                       
                          
                        src/main/${deploy.env}/applicationContext.xml  
                          
                          
                        false  
                       
                    
                
                
             
           
  
           

compile插件maven-compiler-plugin

compile插件执行时先调用resouces插件,功能就是把src\mainjava源码编译成字节码生成class文件,并把编译好的class文件输出到target\classes目录下。下面看执行结果:
  这里写图片描述这里写图片描述

单元测试所用插件

单元测试所用的compile和resources插件和主代码是相同的,但执行的目标不行,目标estCompile和testResources是把src\test\java下的代码编译成字节码输出到target\test-classes,同时把src\test\resources下的配置文件拷贝到target\test-classes。看下面的输出:
这里写图片描述

插件maven-surefire-plugin:2.12.4是执行单元测试类的,在本例中就是运行HelloWorldTest.testSayHello()方法,如果单测试不通行,构建会失败,在编译正式的项目时可以使用mvn -Dmaven.test.skip=true 来跳过测试类的编译和运行过程。mvn test可以单独执行,但是这个命令其实是包括了resources、compile、testResources、testCompile、test这几个阶段,如下图所示:
  深入理解maven构建生命周期和各种plugin插件_第5张图片

打包插件

这个插件是把class文件、配置文件打成一个jar(war或其它格式)包。依赖包是不在jar里面的,需要建立lib目录,且jar和lib目录在同级目录。常用的打包插件有maven-jar-plugin、maven-assembly-plugin、maven-shade-plugin三种,下面分别介绍下各自己pom配置和使用特点。
  maven-jar-plugin
  可执行jar与依赖包是分开,需建立lib目录里来存放需要的j依赖包,且需要jar和lib目录在同级目录


             
                 org.apache.maven.plugins
                 maven-jar-plugin
                 2.6
                 
                    
                         
                             true
                             lib/
                            com.xxx.xxxService
                       
                    
                
            
            
                org.apache.maven.plugins
                maven-dependency-plugin
                2.10
                
                    
                        copy-dependencies
                        package
                        
                            copy-dependencies
                        
                        
                            ${project.build.directory}/lib
                        
                    
                
            

maven-assembly-plugin

这个插件可以把所有的依赖包打入到可执行jar包。但是该插件有个bug会缺失spring的xds文件,导致无法运行jar,同时如果同级目录还有其它可执行jar文件依赖可能会产生冲突。

             
                 maven-assembly-plugin
                 
                     
                         jar-with-dependencies
                     
                     
                         
                             com.xxx.xxxService
                        
                    
                
                
                    
                        make-assembly
                        package
                        
                            single
                        
                    
                
            

maven-shade-plugin

所有的依赖包打入到可执行jar包,如果同级目录有其它可执行jar,依赖可能会产生冲突,且运行jar时,有时会出现SF、DSA、RSA文件冲突的提示,需要排除META-INF目录下的文件。

    
                org.apache.maven.plugins
                maven-shade-plugin
                2.4.3
                
                    
                        package
                        
                            shade
                        
                        
                            
                                
                                    *:*
                                    
                                        META-INF/*.SF
                                        META-INF/*.DSA
                                        META-INF/*.RSA
                                    
                                
                            
                            
                                
                                    META-INF/spring.handlers
                                
                                
                                    META-INF/spring.schemas
                                
                                
                                    META-INF/spring.tooling
                                
                                
                                    com.xxx.xxxInvoke
                                
                            
                            true
                            true
                        
                    
                
            

发布插件maven-install-plugin

发布插件的功能就是把构建好的artifact部署到本地仓库,还有一个deploy插件是将构建好的artifact部署到远程仓库。

你可能感兴趣的:(开发工具,开发工具,maven,插件,生命周期,plugin,lifecycle)