Java系列---Maven插件(与maven的生命周期相关)


一、Maven插件

各个插件的执行顺序一般是:1clean、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其是包括了resourcescompile两个阶段。下面分别来分析各个阶段需要的插件和输出的结果

1. maven-compiler-plugin

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

                                                                                                                                     

                                                                               

    org.apache.maven.plugins                                                                                               

    maven-compiler-plugin                                                                                            

    3.1                                                                                                                    

                                                                                                                               

                            

        1.8                                                                                             

        1.8                                                                                     

        UTF-8

        true                                                                             

        true

        true                                                                                                               

        true                                                        

                   

        1.3                                                                         

        128m                                                                                      

        512m                                                                                              

        -verbose -bootclasspath ${java.home}\lib\rt.jar               

                                                                                                                              

2. maven-jar-plugin

    

        maven-jar-plugin

        

            

            

                monitor

                

                    jar

                

                package

                

                    monitor

                    

                        **/xx/xx/xx/xx/**

                        ???????**/xx/xx/xx/xx/**

                    

                

            

        

编译时,配置非maven 指定的jar包路径

    org.apache.maven.plugins

    maven-compiler-plugin

2.3.2

    1.8

    1.8

        UTF-8

        

            -extdirs

            ${project.basedir}/src/main/resources/lib/

        

    

3. maven-dependency-plugin

    

    

        org.apache.maven.plugins

        maven-dependency-plugin

        2.5.1

        

            

                copy

                install

                

                    copy-dependencies

                

                

                    ${project.build.directory}/lib

                

            

        

4. maven-shade-plugin

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

将部分jar包添加或排除

      

        org.apache.maven.plugins

        maven-shade-plugin

        3.1.1

        

          

            package

            

              shade

            

            

              

                

                  jmock:*

                  *:xml-apis

                  org.apache.maven:lib:tests

                  log4j:log4j:jar:

                

                

                    junit:junit

                

              

            

          

        

      

将依赖jar包内部资源添加或排除

      

        org.apache.maven.plugins

        maven-shade-plugin

        3.1.1

        

          

            package

            

              shade

            

            

              

                

                  junit:junit

                  

                    junit/framework/**

                    org/junit/**

                  

                  

                    org/junit/experimental/**

                    org/junit/runners/**

                  

                

                

                  *:*

                  

                    META-INF/*.SF

                    META-INF/*.DSA

                    META-INF/*.RSA

                  

                

              

            

          

        

      

自动将所有不使用的类排除

      

        org.apache.maven.plugins

        maven-shade-plugin

        3.1.1

        

          

            package

            

              shade

            

            

              true

            

          

        

      

将依赖的类重命名并打包进来 (隔离方案)

      

        org.apache.maven.plugins

        maven-shade-plugin

        3.1.1

        

          

            package

            

              shade

            

            

              

                

                  org.codehaus.plexus.util

                  org.shaded.plexus.util

                  

                    org.codehaus.plexus.util.xml.Xpp3Dom

                    org.codehaus.plexus.util.xml.pull.*

                  

                

              

            

          

        

      

修改包的后缀名

      

        org.apache.maven.plugins

        maven-shade-plugin

        3.1.1

        

          

            package

            

              shade

            

            

              true

              jackofall

            

          

        

      

问题:Invalid signature file digest for Manifest main attributes

原因:有些jar包生成时,会 使用jarsigner生成文件签名(完成性校验),分为两个文件存放在META-INF目录下:

a signature file, with a .SF extension

a signature block file, with a .DSA, .RSA, or .EC extension

解决方案:生成 uber-jar时,将这些排除掉,不再进行完成性校验,如下所示:

          

            

              *:*

              

                META-INF/*.SF

                META-INF/*.DSA

                META-INF/*.RSA

              

            

          

        

较详细的版本

    

                org.apache.maven.plugins

                maven-shade-plugin

                2.4.3

                

                    

                        package

                        

                            shade

                        

                        

                            

                                

                                    *:*

                                    

                                        META-INF/*.SF

                                        META-INF/*.DSA

                                        META-INF/*.RSA

                                    

                                

                            

                            

                                

                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">

                                    META-INF/spring.handlers

                                

                                

                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">

                                    META-INF/spring.schemas

                                

                                

                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">

                                    META-INF/spring.tooling

                                

                                

                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">

                                    com.xxx.xxxInvoke

                                

                            

                            true

                            true

                        

                    

                

            

5. maven-resources-plugin

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  

                       

                    

                

                

             

           

         

6. maven-assembly-plugin

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

             

                 maven-assembly-plugin

                 

                     

                         jar-with-dependencies

                     

                     

                         

                             com.xxx.xxxService

                        

                    

                

                

                    

                        make-assembly

                        package

                        

                            single

                        

                    

                

            

7. maven-antrun-plugin

    

        org.apache.maven.plugins

        maven-antrun-plugin

        1.8

        

            

                install

                

                    run

                

                

                    

                        Building 描述信息 START....

                        

                        

                        

                        

                        

                        

                            

                        

                        

                        

                            

                            

                        

                        

                        

                            

                        

                        

                            

                        

                        

                            

                        

                        

                                  forceOverwrite="yes" algorithm="MD5" fileext=".MD5">

                        

                        Building 描述信息 END

                    

                

            

        

    

二、maven三种打包插件

第一种:可执行jar与依赖分开,依赖在lib目录里,需要jar和lib目录在同级目录,
优点:jar文件很小 
缺点:需要放置lib文件夹在平级目录

1            
 2                org.apache.maven.plugins
 3                maven-jar-plugin
 4                2.6
 5                
 6                    
 7                        
 8                            true
 9                            lib/
10                            com.xxx.xxxService
11                        

12                    

13                

14            

15            
16                org.apache.maven.plugins
17                maven-dependency-plugin
18                2.10
19                
20                    
21                        copy-dependencies
22                        package
23                        
24                            copy-dependencies
25                        

26                        
27                            ${project.build.directory}/lib
28                        

29                    

30                

31            

第二种:把所有依赖打进同一个jar包里。
缺点:jar文件会比较大,同时该插件有个bug会缺失springxds文件,导致无法运行jar,同时如果同级目录还有其它可执行jar文件依赖可能会产生冲突
优点:方便快捷,打包完直接就能运行。

 1            
 2                maven-assembly-plugin
 3                
 4                    
 5                        jar-with-dependencies
 6                    

 7                    
 8                        
 9                            com.xxx.xxxService
10                        

11                    

12                

13                
14                    
15                        make-assembly
16                        package
17                        
18                            single
19                        

20                    

21                

22            

第三种:所有依赖打到同一个jar文件里。
缺点:jar文件过大、如果同级目录有其它可执行jar,依赖可能会产生冲突
优点:不会有任何bug,直接打成可执行jar文件,最省事。

 1            
 2                org.apache.maven.plugins
 3                maven-shade-plugin
 4                2.4.3
 5                
 6                    
 7                        package
 8                        
 9                            shade
10                        

11                        
12                            
13                                
14                                    *:*
15                                    
16                                        META-INF/*.SF
17                                        META-INF/*.DSA
18                                        META-INF/*.RSA
19                                    

20                                

21                            

22                            
23                                24                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
25                                    META-INF/spring.handlers
26                                
27                                28                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
29                                    META-INF/spring.schemas
30                                
31                                32                                        implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer">
33                                    META-INF/spring.tooling
34                                
35                                36                                        implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
37                                    com.xxx.xxxInvoke
38                                
39                            

40                            true
41                            true
42                        

43                    

44                

45            

三、找不到主属清单原因

  1. 打包时jdkjre区别设置,优选jdk

在项目上右键-->build path---->config build path 选择本机jdk不要jre

右键ruan as  ---> run configuartions指定jdk版本

  1. project---> clean 最粗暴的方式
  2. Maven clean
  3. Maven-jar-pluge打包插件指定 mainclass