您当前的位置: 首页 >  maven

cuiyaonan2000

暂无认证

  • 0浏览

    0关注

    248博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Maven插件统计整理

cuiyaonan2000 发布时间:2020-06-23 14:10:06 ,浏览量:0

序言

        Maven的插件到现在是真的多起来了.每种插件应对不同的场景. 现整理下用过插件的使用方法与应对场景(持续更新cuiyaonan2000@163.com)

        Maven插件是针对使用Maven工程的插件,不局限于开发工具Eclipse或者Idea.唯一比较注意的就是Idea可能提供了一些工具兼容这些插件,可以它让我们跳过命令去玩.但是这样子就会有些问题,毕竟有的人用Eclipse,有的人用Idear.所以了解插件原理是最好的.cuiyaonan2000@163.com

插件一览 spring-boot-maven-plugin

Spring Boot Maven plugin的5个Goals(Spring Boot Maven plugin的最主要goal就是repackage,其在Maven的package生命周期阶段,能够将mvn package生成的软件包,再次打包为可执行的软件包,并将mvn package生成的软件包重命名为*.original。)

  • spring-boot:repackage,默认goal。在mvn package之后,再次打包可执行的jar/war,同时保留mvn package生成的jar/war为.origin
  • spring-boot:run,运行Spring Boot应用
  • spring-boot:start,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • spring-boot:stop,在mvn integration-test阶段,进行Spring Boot应用生命周期的管理
  • spring-boot:build-info,生成Actuator使用的构建信息文件build-info.properties


	org.springframework.boot
	spring-boot-maven-plugin
	
	    cui.yao.nan.erureka.EurekaServerApplication
             
        

	

layout属性的值可以如下:

  • JAR,即通常的可执行jar

Main-Class: org.springframework.boot.loader.JarLauncher

  • WAR,即通常的可执行war,需要的servlet容器依赖位于WEB-INF/lib-provided

Main-Class: org.springframework.boot.loader.warLauncher

  • ZIP,即DIR,类似于JAR

Main-Class: org.springframework.boot.loader.PropertiesLauncher

  • MODULE,将所有的依赖库打包(scope为provided的除外),但是不打包Spring Boot的任何Launcher
  • NONE,将所有的依赖库打包,但是不打包Spring Boot的任何Launcher

关注点: 很多计算框架 需要指定--class(即启动类),如果使用该插件打包的Jar 则可以不用指定main class ,因为他是可执行的jar(cuiyaonan2000@163.com)

maven-shade-plugin

主要功能如下

  1. 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);
  2. 对依赖的jar包进行重命名(用于类的隔离);

打包插件的区别

pluginfunctionmaven-jar-pluginmaven 默认打包插件,用来创建 project jarmaven-shade-plugin用来打可执行包,包含依赖,以及对依赖进行取舍过滤maven-assembly-plugin支持定制化打包方式,更多是对项目目录的重新组装
  
    org.apache.maven.plugins  
    maven-shade-plugin  
    1.4  
      
          

            
            package  
              
                shade  
              


              
                
                                                                                                             
           true
            
			true


                 
                
                  
                      
                        *:*  
                          
                            META-INF/*.SF  
                            META-INF/*.DSA  
                            META-INF/*.RSA  
                          
                      
                  

               
                
                    
                      jmock:*
                      *:xml-apis
                      org.apache.maven:lib:tests
                      log4j:log4j:jar:
                    
                    
                        junit:junit
                    
                


                 
                  

                    
                     
                       cui.yao.nan.StartMain  
                     

                    
                     
                       META-INF/spring.handlers  
                     
                          

                      
                    
                       META-INF/spring.schemas  
                    

                   

                   
				        META-INF/spring.factories
				   

                  

              
          
      
  

docker-maven-plugin

       docker-maven-plugin 插件就是为了帮助我们在Maven工程中,通过简单的配置,自动生成镜像并推送到仓库中。

       构建镜像可以使用一下两种方式,

  • 第一种是将构建信息指定到 POM 中
  • 第二种是使用已存在的 Dockerfile 构建。

      第一种方式,支持将 FROM, ENTRYPOINT, CMD, MAINTAINER 以及 ADD 信息配置在 POM 中,不需要使用 Dockerfile 配置。但是如果使用 VOLUME 或其他 Dockerfile 中的命令的时候,需要使用第二种方式,创建一个 Dockerfile,并在 POM 中配置 dockerDirectory 来指定路径即可。

指定构建信息到 POM 中构建

    
        
            com.spotify
            docker-maven-plugin
            1.0.0
            
                mavendemo
                java
                docker_maven docker_maven@email.com
                /ROOT
                ["java", "-version"]
                ["java", "-jar", "${project.build.finalName}.jar"]
                
                
                    
                        /ROOT
                        
                        ${project.build.directory}
                        
                        ${project.build.finalName}.jar
                    
                
            
        
    
使用 Dockerfile 构建

    
         
            com.spotify
            docker-maven-plugin
            1.0.0
            
                mavendemo
                ${basedir}/docker 
                
                
                    
                        /ROOT
                        ${project.build.directory}
                        ${project.build.finalName}.jar
                    
                
            
           
    


${basedir}/docker/Dockerfile 配置

FROM java
MAINTAINER docker_maven docker_maven@email.com
WORKDIR /ROOT
CMD ["java", "-version"]
ENTRYPOINT ["java", "-jar", "${project.build.finalName}.jar"]
执行命令

在mnv工程上执行如下的命令就可以创建镜像了

  • mvn clean package docker:build 只执行 build 操作
  • mvn clean package docker:build -DpushImage 执行 build 完成后 push 镜像
  • mvn clean package docker:build -DpushImageTag 执行 build 并 push 指定 tag 的镜像(注意:这里必须指定至少一个 imageTag,它可以配置到 POM 中,也可以在命令行指定。命令行指定如下:mvn clean package docker:build -DpushImageTags -DdockerImageTags=imageTag_1 -DdockerImageTags=imageTag_2,POM 文件中指定配置如下)
  • -DskipDockerBuild 跳过 build 镜像 示例:mvn package -DskipDockerBuild
  • -DskipDockerTag 跳过 tag 镜像 示例:mvn package -DskipDockerTag
  • -DskipDockerPush 跳过 push 镜像 示例:mvn package -DskipDockerPush
  • -DskipDocker 跳过整个阶段 示例:mvn package -DskipDocker

  
    ...
    
      
        ...
        
           imageTag_1
           imageTag_2
        
      
    
    ...
  
绑定Docker 命令到 Maven 各个阶段

如下示例,当我们执行mvn package时,执行 build、tag 操作,当执行mvn deploy时,执行build、tag、push 操作。如果我们想跳过 docker 某个过程时,只需要:mvn package -DskipDockerPush


    
        
            com.spotify
            docker-maven-plugin
            1.0.0
            
                mavendemo
                java
                docker_maven docker_maven@email.com
                /ROOT
                ["java", "-version"]
                ["java", "-jar", "${project.build.finalName}.jar"]
                
                    
                        /ROOT
                        ${project.build.directory}
                        ${project.build.finalName}.jar
                    
                
            
            
                
                    build-image
                    package
                    
                        build
                    
                
                
                    tag-image
                    package
                    
                        tag
                    
                    
                        mavendemo:latest
                        docker.io/wanyang3/mavendemo:${project.version}
                    
                
                
                    push-image
                    deploy
                    
                        push
                    
                    
                        docker.io/wanyang3/mavendemo:${project.version}
                    
                
            
        
    
推送到私有 Docker 仓库地址

实际工作环境中,我们需要 push 镜像到我们私有 Docker 仓库中,使用d ocker-maven-plugin 插件我们也是很容易实现,有几种方式实现:

  • 修改 POM 文件 imageName 操作 (这个是在config中指定镜像标签)
  • 修改 POM 文件中 newName 操作(这个是在绑定tag与maven阶段的时候设置)

如上的配置分别如下所示:

...


    mavendemo
    ...


    tag-image
    package
    
        tag
    
    
        mavendemo
        registry.example.com/wanyang3/mavendemo:v1.0.0
    

...
安全认证配置(推送到远程服务前需要先登录该远程服务仓库)

可以通过命令行 docker login -u user_name -p password docker_registry_host 登录,但是对于自动化流程来说,就不是很方便了。使用 docker-maven-plugin 插件我们可以很容易实现安全认证。

首先在 Maven 的配置文件 setting.xml 中增加相关 server 配置,主要配置 Docker registry用户认证信息。


  
    my-docker-registry
    wanyang3
    12345678
    
      wanyang3@mail.com
    
  

然后只需要在 pom.xml 中使用 server id 即可。


  
    com.spotify
    docker-maven-plugin
    1.0.0
    
      registry.example.com/wanyang3/mavendemo:v1.0.0
      ...

     
      my-docker-registry
    
  
maven-antrun-plugin

        该插件提供从Maven内运行Ant任务的功能。您甚至可以将您的Ant脚本嵌入POM!

        这个插件不是提供污染POM的手段意图,因此它鼓励所有Ant任务移动到build.xml文件并使用Ant的POM的 task调用它(或者说所有在build.xml文件的Ant任务移动到POM中,并使用 task调用它)。

       这个插件的主要目的之一是方便从Ant基础项目迁移到Maven。某些项目可能无法迁移,因为它们依赖于默认情况下Maven不提供的自定义构建功能。

maven-surefire-plugin

       如果你执行过mvn test或者执行其他maven命令时跑了测试用例,你就已经用过maven-surefire-plugin了。maven-surefire-plugin是maven里执行测试用例的插件,不显示配置就会用默认配置。这个插件的surefire:test命令会默认绑定maven执行的test阶段

       在默认情况下,maven-surefire-plugin的test目标会自动执行测试源码路径(默认为src/test/java/)下所有符合一组命名模式的测试类。这组模式为:

  • **/Test*.java:任何子目录所有命名以Test开头的Java类。
  • **/*Test.java:任何子目录下所有命名以Test结尾的Java类。
  • **/*TestCase.java:任何子目录下所有命名以TestCase结尾的Java类。
maven-dependency-plugin

       是处理与依赖相关的插件。它有很多可用的goal,大部分是依赖构建、分析和解决相关的goal,这部分goal可以直接用maven的命令操作,例如:mvn dependency:tree(这个常用)、mvn dependency:analyze .

因为有很多goal 届时根据需要选择自己合适的.总之该插件用于控制依赖的jar.打包时将所有jar放到一个统一的位置.或者控制解压等操作.


    org.apache.maven.plugins
    maven-dependency-plugin
    3.1.1
    
        
            copy-dependencies
            package
            
                copy-dependencies
            
            
                
                ${project.build.directory}/alternateLocation
                false
                false
                true
            
        
    
maven-resources-plugin

     插件负责处理项目资源文件并拷贝到输出目录.目标即功能有多种,根据需要选择合适自己的.

maven-compiler-plugin

        常用于指定maven编译项目的jdk版本.既然是编译就可以控制编译哪个包下的代码


    org.apache.maven.plugins
	maven-compiler-plugin
	
	    ${java.version}
		${java.version}
        
		
		    /nan/yao/cui/kafka/**
			/nan/yao/cui/hbase/**
			
			/nan/yao/cui/dubbo/**
			/nan/yao/cui/nacos/**
			/nan/yao/cui/RabbitMq/**
		
	

maven-jar-plugin

默认的打包插件,用来打普通的project jar包;

            
                org.apache.maven.plugins
                maven-jar-plugin
                
                    
                         
                             
                             com.yh.main.HelloMavenJar
                             
                            true
                            
                            lib/
                        
                     
                 
            

如上addClasspath如果为true,且在classpathPrefix中设置了该jar需要引用的jar包位置。则显示如下的内容:

进入META-INF

查看MAINFEST.MF文件 该文件内容就是我们配置的内容

可以看到class-path中设置了需要引用的jar位置。注意该lib需要与我们打的jar同级目录

’最底下为我们的在pom中设置的main类信息

maven-war-plugin

默认的打包插件,用来打普通的project war包;

            
                org.apache.maven.plugins
                maven-war-plugin
            

maven-assembly-plugin

       该插件支持自定义的打包结构,也可以定制依赖项等.(这个自定义的打包功能主要依赖于后面将会详细介绍的 来实际执行打包的过程,所以关于插件的配置很简单cuiyaonan2000@163.com,但是需要 写好)

       插件配置结构如下所示:

    

        
            
            
            
                org.apache.maven.plugins
                maven-assembly-plugin
                ${maven-assembly-plugin.version}

                
                    
                        make-assembly

                        
                        package

                        
                            
                            single
                        

                    
                

                
                    
                            com.***.startup.BootStrap 
                        
                      
                    -->

                    
                    src/main/assembly/cuiyaonan2000Assembly.xml
           
                    

                
            

        

    

最主要的就是 描述符文件了.maven提供了4中默认的描述符文件格式(都不建议用,要用这些还不如直接用默认的打包插件)

  1. bin : 类似于默认打包,会将bin目录下的文件打到包中;
  2. jar-with-dependencies : 会将所有依赖都解压打包到生成物中;官方提供的 descriptorRef 有 bin, jar-with-dependencies, src, project .(这些就是目录可以通过fileSets控制,该目录的文件从源代码哪里来)
  3. src :只将源码目录下的文件打包;
  4. project : 将整个project资源打包。
描述符文件格式如下所示(xml的内容标签内容非常多,但是不是哪个都有用,可以根据需要选择.):


    
    
    ${project.version}
    
    
    
        jar
    
    
    
    true
    
    
    
        
            true 
            lib 
            runtime 
        
    

    
    
    
        
            
            src/main/script/linux/bin 

            
            bin

            
            
                terminal-dispatch
                server
            
            
            
            0755

                

        
            src/main/resources
            conf
            
                config.properties
                logback.xml
            
            0644
        
        
            src/main/script/conf
            conf
            
                wrapper.conf
            
            0644
        
        
            src/main/script/linux/lib
            lib
            
                libwrapper.so
                wrapper.jar
            
            0755
        
    


    
        
        

            
            

            
            

            
            

            
            

            
            
                
                

                
                

                
                

                
                

                
                

                
                

                
                
                  
                    

                   

                

            
                       
        
    
    

描述符文文件完整格式

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

    
    
    
        
        
            
            
            
            
            
            
        
    
    
    
    
        
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                    
                    
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                    
                
                
                
                
                
                
                
                
                
                
            
            
            
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                    
                    
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                            
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                        
                    
                
                
                
                
                
                
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                    
                
                
                
                
            
        
    
    
    
    
        
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    
    
    
    
        
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    
    
    
        
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
                
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
        
    
    
    
    
        
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
            
                
                    
                    
                    
                    
                    
                    
                    
                    
                    
                
            
            
            
            
        
    
    
    
    

jgitflow-maven-plugin

该插件首先基于Git仓库.主要功能是帮助我们创建分支,合并分支.如何帮助我们根据不同的情况创建呢.它又自己的一套约定基础如下所示(cuiyaonan2000@163.com)

  • 开发流程: 每次开发从develop拉出feature分支,开发完成后合并到dev分支。
  • 发布流程: 从develop分支检出release分支,测试完成后合并回develop分支和master分支
  • 修复bug: 从master分支检出hotfix分支,测试完成后合并回develop(如果存在release,合并到release)分支和master分支

如上规则其实我们平时的git命令就可以完成.但是它就是要有这个插件.这个插件存在的目的就是为了规范开发按流程cuiyaonan2000@163.com

配置如下所示:


    external.atlassian.jgitflow
	jgitflow-maven-plugin
	1.0-m5.1
	

        
	    git仓库的账号
		git仓库的账号密码

        

            
            master
        
            
		    develop

            
		    feature-

            
		    release-

            
		    hotfix-

            
		    cuiyaonan2000@163.com-

        

	
问题

在pom中增加了插件后,如果报错 

Failure to find org.eclipse.m2e:lifecycle-mapping:jar:1.0.0 in https://maven.aliyun.com/repository/
  1. GitHub - BINGOcoder1998/dummy-lifecycle-mapping-plugin 下载该zip
  2. 执行命令mvn -Dmaven.test.skip -U clean install 

命令

针对如上的不同分支开发环境,相似的提供了如下命令,让我们便于新建分支同时合并分支(如何合并基于如上的约定)

命令        说明mvn jgitflow:feature-startdevelop拉出feature分支,如果不存在develop分支则会自动创建mvn jgitflow:feature-finish开发完成后合并到develop分支mvn jgitflow:release-start从develop分支检出release分支mvn jgitflow:release-finish测试完成后合并回develop分支和master分支mvn jgitflow:hotfix-start从master分支检出hotfix分支mvn jgitflow:hotfix-finish完成后合并回develop(如果存在release,合并到release)分支和master分支

如上当工程只有master分支的时候,使用命令会自动创建develop分支.cuiyaonan2000@163.com

命令参数

举例一个命令:

mvn jgitflow:release-start -DallowSnapshots=true  -updateDependencies=false -X

由上可以看到2个参数也是常用的

  • -DallowSnapshots=true                 --允许pom中有snapshots的依赖包.最好带上这个否则监察你的工程中是否有snapshots的包,速度巨慢cuiyaonan2000@163.com
  •  -updateDependencies=false         --自动更新jar
  • -DreleaseVersion=                         --上线后的正式版本号
  • -DdevelopmentVersion=                --下一次使用的版本号

更多的参数看如下截图,各取所取好吧

关注
打赏
1638267374
查看更多评论
立即登录/注册

微信扫码登录

0.8090s