Maven本质上是一个插件框架,它的核心并不执行任何具体的构建任务,所有这些任务都交给插件来完成,例如编译源代码是由maven-compiler-plugin完成的。进一步说,每个任务对应了一个插件目标(goal),每个插件会有一个或者多个目标,例如maven-compiler-plugin的compile目标用来编译位于src/main//
目录下的主源码,testCompile目标用来编译位于src/test/java/
目录下的测试源码。
用户可以通过两种方式调用Maven插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户在命令行只是输入生命周期阶段而已,例如Maven默认将maven-compiler-plugin的compile目标与 compile生命周期阶段绑定,因此命令mvn compile实际上是先定位到compile这一生命周期阶段,然后再根据绑定关系调用maven-compiler-plugin的compile目标。第二种方式是直接在命令行指定要执行的插件目标,例如mvn archetype:generate 就表示调用maven-archetype-plugin的generate目标,这种带冒号的调用方式与生命周期无关。
一、变量-自定义变量及内置变量
1.自定义变量
tools UTF-8
2.内置变量
${basedir} 项目根目录 ${project.build.directory} 构建目录,缺省为target ${project.build.outputDirectory} 构建过程输出目录,缺省为target/classes ${project.build.finalName} 产出物名称,缺省为${project.artifactId}-${project.version} ${project.packaging} 打包类型,缺省为jar ${project.xxx} 当前pom文件的任意节点的内容
二、常见插件配置
clean插件
org.apache.maven.plugins maven-clean-plugin 2.5 F:/logs ../message-test spy.log ../message-test/target
单元测试插件
org.apache.maven.plugins maven-surefire-plugin 2.16 true
skip=true,表示跳过单元测试,相当于-Dmaven.test.skip=true。
但是在执行mvn test -Dtest时,也会被跳过。解决方法是用excludes跳过所有测试,而不是用skipTests。org.apache.maven.plugins maven-surefire-plugin 2.16 **/*.java
即跳过所有test。这样再执行mvn test -Dtest就没有问题了。
资源文件插件
org.apache.maven.plugins maven-resources-plugin 2.6 copy-resources validate copy-resources ${basedir}/target/test-classes ${basedir}/src/main/webapp/WEB-INF/config true **/*.txt **/*.properties **/*.xml src/test/resources **/*.txt **/*.xml **/*.properties
为了使项目结构更为清晰,Maven区别对待Java代码文件和资源文件,maven-compiler-plugin用来编译Java代码,maven-resources-plugin则用来处理资源文件。默认的主资源文件目录是src/main/resources
,很多用户会需要添加额外的资源文件目录,这个时候就可以通过配置maven-resources-plugin来实现。此外,资源文件过滤也是Maven的一大特性,你可以在资源文件中使用${propertyName}形式的Maven属性,然后配置maven-resources-plugin开启对资源文件的过滤,之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建。
编译插件
org.apache.maven.plugins maven-compiler-plugin 3.1
默认编译插件
拷贝依赖jar包到指定目录
org.apache.maven.plugins maven-dependency-plugin 2.6 copy-dependencies compile copy-dependencies ${project.build.directory}/lib false true
maven-dependency-plugin最大的用途是帮助分析项目依赖,dependency:list能够列出项目最终解析到的依赖列表,dependency:tree能进一步的描绘项目依赖树,dependency:analyze可以告诉你项目依赖潜在的问题,如果你有直接使用到的却未声明的依赖,该目标就会发出警告。maven-dependency-plugin还有很多目标帮助你操作依赖文件,例如dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面。
项目打成jar包
打成jar包插件:打成war包插件: org.apache.maven.plugins maven-jar-plugin 2.4 true lib/ com.*.MainClass org.apache.maven.plugins maven-war-plugin 2.1.1 src/main/webapp **/*.jpg
默认打包插件
运行插件
org.codehaus.mojo exec-maven-plugin 1.2.1 java com.yunzero.App
如果我们运行的时候需要提供一些输入的参数,可以通过configuration的元素里添加。这样后续要执行这个程序时,我们只需要在命令行执行如下命令:mvn exec:java ,然后程序就可以运行起来了。
自定义打包
maven-assembly-plugin 2.4.1 make-zip package single src/assembly/assembly.xml
assembly.xml文件
distribution tar.gz ${project.basedir}\src\main\resources \ ${project.basedir}\src\bin \bin true lib runtime
生成的lib文件夹下放该项目的所有依赖以及该服务jar包,src/main/bin文件夹下我们一般放start.sh和stop.sh两个脚本文件用来开启和关闭该服务,打包后直接放到根目录下。生成的tar.gz文件的名字为:maven-assembly-plugin插件中配置的finalName-assembly.xml配置的id(若assembly中没有指定id,则只有前半部分).
不同环境获取不同配置文件
org.codehaus.mojo properties-maven-plugin 1.0.0 profiles/${runtime.env}/jdbc.properties profiles/${runtime.env}/redis.properties profiles/${runtime.env}/batch.properties profiles/${runtime.env}/config.properties initialize read-project-properties
随着项目的不断迭代,我们的资源配置项将会变得更多,这个会直接影响到pom.xml的体积膨胀;此外,如果项目目标部署环境比较多,pom.xml将会膨胀得更快,更加难以维护。为了解决这个问题,我们需要将这些配置信息独立出来,并按照不同环境进行归类,使用properties-maven-plugin就会达到这个效果。
示例用法(将每个环境的信息放在不同的目录下,然后在mvn package切换不同的profile实现去指定目录读取配置信息,用读取到的value去替换资源配置文件的占位符)
maven-shade-plugin
org.apache.maven.plugins maven-shade-plugin 3.0.0 package shade batch true jar-with-dependencies com.fastjrun.demospring4.BatchInit META-INF/spring.handlers META-INF/spring.schemas META-INF/spring.tooling *:* META-INF/*.SF META-INF/*.DSA META-INF/*.RSA
有时候,我们需要将所有配置文件和依赖库文件全部放在一个jar包中,运维的同事只需要执行java -jar batch.jar即可完成启动。虽然使用maven-assembly-plugin也可以做到这一点,但是在读取配置文件的时候有可能会遇到一些问题,这个时候,我们可能需要使用到maven-shade-plugin这个插件,经笔者实践按照如下示例用法配置确实可用;当然本示例配置了mainClass,直接执行java -jar batch.jar确实没问题,但如果执行java com.fastjrun.demospring4.BatchInit -classpath batch.jar也是可以的。
更多插件请查看:
http://maven.apache.org/plugins/index.html?spm=a2c4e.11153940.blogcont26377.4.49b44321W1482B