Maven的插件到现在是真的多起来了.每种插件应对不同的场景. 现整理下用过插件的使用方法与应对场景(持续更新cuiyaonan2000@163.com)
Maven插件是针对使用Maven工程的插件,不局限于开发工具Eclipse或者Idea.唯一比较注意的就是Idea可能提供了一些工具兼容这些插件,可以它让我们跳过命令去玩.但是这样子就会有些问题,毕竟有的人用Eclipse,有的人用Idear.所以了解插件原理是最好的.cuiyaonan2000@163.com
插件一览 spring-boot-maven-pluginSpring 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主要功能如下
- 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);
- 对依赖的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
来指定路径即可。
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类。
是处理与依赖相关的插件。它有很多可用的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类信息
默认的打包插件,用来打普通的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中默认的描述符文件格式(都不建议用,要用这些还不如直接用默认的打包插件)
- bin : 类似于默认打包,会将bin目录下的文件打到包中;
- jar-with-dependencies : 会将所有依赖都解压打包到生成物中;官方提供的 descriptorRef 有 bin, jar-with-dependencies, src, project .(这些就是目录可以通过fileSets控制,该目录的文件从源代码哪里来)
- src :只将源码目录下的文件打包;
- project : 将整个project资源打包。
${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/
- GitHub - BINGOcoder1998/dummy-lifecycle-mapping-plugin 下载该zip
- 执行命令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= --下一次使用的版本号
更多的参数看如下截图,各取所取好吧