maven生命周期和插件
maven生命周期和插件
目录
maven-dependency-plugin 依赖分析及控制
maven-enforcer-plugin 定义规则并强制要求项目遵守
基础概念
maven中基础概念主要有生命周期以及插件两种。
生命周期
maven生命周期是maven将软件开发的通用生命周期进行了提炼,最后得到的软件开发过程中常用的一些步骤组合,对于maven而言,生命周期分为三种:
- clean生命周期
- default生命周期
- site生命周期
其中,clean生命周期主要是做一些清理工作,它又包含pre-clean, clean, post-clean等步骤,每个步骤里要做什么事情,是由插件目标来完成的。而这种步骤被称为phase。
default生命周期包含以下几个phase:
- validate
- compile
- test
- package
- verify
- install
- deploy
我们调用mvn clean install时,经过了两个生命周期:clean生命周期和default生命周期,每个生命周期执行的内容包含:
| preclean | validate |
| clean | compile |
| test | |
| package | |
| verify | |
| install |
即会执行从开始到指定phase之间的所有phase。
site生命周期:包含pre-site, site, post-site,site-deploy的阶段。目的的建立和发布项目站点,maven能够基于pom所包含的信息,自动生成一个友好的站点。
插件
maven主体只定义了生命周期及生命周期所包含的阶段,其具体功能是由插件来完成的,而每个插件可能有多个功能,比如compiler,即可以compile,也可以testCompile,这两项插件功能被称为插件目标。
可以把插件理解为一个类,而插件目录则是插件中的一个函数,它实现了插件对外提供的某项功能。
使用:mvn [plugin-name]:[goal-name]
例如:mvn compiler:compile
项目中常用插件列表如下:
maven-clean-plugin 清理项目
目标:clean
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<skip>true</skip>
<!--当执行mvn clean package这样的命令时,如果clean执行失败,会导致整个构建停止.为了让clean执行出错后还能继续执行其他命令,就需要配置让忽略错误-->
<failOnError>false</failOnError>
<!--当配置true时,只清理filesets里的文件,构建目录中的文件不被清理.默认是flase.-->
<excludeDefaultDirectories>false</excludeDefaultDirectories>
<filesets>
<fileset>
<!--要清理的目录位置-->
<directory>${basedir}/logs</directory>
<!--是否跟随符号链接 (symbolic links)-->
<followSymlinks>false</followSymlinks>
<!--默认有些文件是不会被清理的,比如.svn文件,如果设置成false,则全部按照自定义的来处理-->
<useDefaultExcludes>true</useDefaultExcludes>
<!--对这些文件进行清理-->
<includes>
<include>**/*</include>
</includes>
<!--对这些文件不清理-->
<excludes>
<exclude>nc*</exclude>
</excludes>
</fileset>
</filesets>
</configuration>
</plugin>
maven-compiler-plugin 编译项目
目标:compile, testCompile
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source> <!-- 源代码使用的开发版本 -->
<target>1.8</target> <!-- 需要生成的目标class文件的编译版本 -->
<!-- fork is enable,用于明确表示编译版本配置的可用 -->
<fork>true</fork>
<!--设置插件是否以详细模式运行,默认为来自Maven的全局调试标志-X -->
<verbose>true</verbose>
<encoding>UTF-8</encoding>
<!-- 这个选项用来传递编译器自身不包含但是却支持的参数选项 -->
<compilerArguments>
war
<sourcepath>
${project.basedir}/src/main/java
</sourcepath>
</compilerArguments>
</configuration>
</plugin>
maven-deploy-plugin 部署项目
目标:deploy(部署artifact到远程仓库), deploy-file(安装artifact到远程仓库), help
在setting.xml文件中配置<server></server>(如果远程仓库没有验证可以忽略)
<server>
<id>internal.repo</id>
<username>maven</username>
<password>foobar</password>
</server>
<plugin>
<!-- 发布插件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.5</version>
</plugin>
<!--其中id和server对应的id相同-->
<distributionManagement>
<repository>
<id>internal.repo</id>
<name>Local Nexus Repository</name>
<url>releases-url</url>
</repository>
<snapshotRepository>
<id>nexus-snapshots</id>
<name>Local Nexus Repository</name>
<url>snapshot-url</url>
</snapshotRepository>
</distributionManagement>
maven-install-plugin 安装项目
目标:install,install-file, help
<!--是将一个以linux结尾的文件作为本项目artifact的classifier安装到仓库。-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.1</version>
<executions>
<execution>
<id>linux</id>
<goals>
<goal>install-file</goal>
</goals>
<phase>install</phase>
<configuration>
<groupId>com.jm.samples</groupId>
<artifactId>samples</artifactId>
<version>${project.version}</version>
<classifier>linux</classifier>
<packaging>jar</packaging>
<file>${project.build.directory}/${project.build.finalName}-linux.jar</file>
</configuration>
</execution>
</executions>
</plugin>
这里拓展一下classifier标签的作用
1.用法
告诉maven依赖com\cloud\common-auth\0.0.1-SNAPSHOT目录下依赖哪个jar包,下面例子依赖common-auth-0.0.1-SNAPSHOT-core.jar包
假如这个目录下有以下两个jar包:
common-auth-0.0.1-SNAPSHOT.jar
common-auth-0.0.1-SNAPSHOT-core.jar
<dependency>
<groupId>com.cloud</groupId>
<artifactId>common-auth</artifactId>
<classifier>core</classifier>
</dependency>
2.用法
使用maven-jar-plugin打包的时候,多打一个包,名字带有core的jar包
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<phase>compile</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<!-- 添加core 修饰方便其它兄弟项目依赖此项目 -->
<classifier>core</classifier>
<includes>
<include>**/com/cloud/</include>
</includes>
</configuration>
</execution>
</executions>
</plugin>
maven-resources-plugin 处理资源文件
目标:resources, testResources
指定resources插件读取和写入文件的字符编码,比如ASCII,UTF-8或UTF-16。
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
也可以指定${project.build.sourceEncoding}属性
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
默认情况下,Maven会从项目的src/main/resources目录下查找资源。如果你的资源不在此目录下,可以用<resources>标签指定,同时也支持多个目录。
<build>
<resources>
<resource>
<directory>src/main/resources1</directory>
</resource>
<resource>
<directory>src/main/resources2</directory>
</resource>
</resources>
</build>
有的时候,资源文件中存在变量引用,可以使用<filtering>标签指定是否替换资源中的变量。变量的来源为pom文件中的<properties>标签中定义的变量。也可以在<build>中定义过滤器资源,还可以使用<includes>和<excludes>来精细控制。
<build>
<filters>
<filter>filter-values.properties</filter>
</filters>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.txt</include>
<include>**/*.rtf</include>
</includes>
<excludes>
<exclude>**/*.bmp</exclude>
<exclude>**/*.jpg</exclude>
<exclude>**/*.jpeg</exclude>
<exclude>**/*.gif</exclude>
</excludes>
</resource>
</resources>
</build>
如果资源中本来存在${}字符,不需要被替换,可以在$前加\,并在<configuration>中使用<escapeString>。
另外,目录下存在二进制文件,需要排除,也可以在<configuration>中使用<nonFilteredFileExtensions>根据后缀来过滤。
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<encoding>UTF-8</encoding>
<escapeString>\</escapeString>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>pdf</nonFilteredFileExtension>
<nonFilteredFileExtension>swf</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugins>
需要在其他阶段拷贝资源文件, 通过phase标签
<build>
<plugins>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
<executions>
<execution>
<id>copy-resources</id>
<!-- here the phase you need -->
<phase>validate</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>${basedir}/target/extra-resources</outputDirectory>
<resources>
<resource>
<directory>src/non-packaged-resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
maven-site-plugin 生成站点
目标:site(默认将在target/site/目录下生成站点,默认XHTML形式), deploy(deploy部署到Web服务器)
在Apache Maven Site Plugin中,站点的生成是基于Velocity模板的,默认使用default-site.vm模板,可以在pom.xml中配置其他模板文件。
站点的内容在Maven项目中的位置src/site/
站点的内容默认可以采用的4种文档格式(也可以支持其他格式):
- APT(Almost Plain Text),Wiki常用格式
- FML(FAQ Markup Language),FAQ格式
- XDoc,XDoc格式
- Markdown(从maven-site-plugin 3.3开始支持),轻量级的标记语言
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-site-plugin</artifactId>
<version>3.6</version>
<configuration>
<locales>en,zh</locales><!--站点源代码中的国际化-->
<templateFile>${basedir}/maven-site.vm</templateFile>
</configuration>
</plugin>
maven-dependency-plugin 依赖分析及控制
目标:analyze, tree, list,copy, copy-dependencies, unpack, unpack-dependencies
dependency:copy:将一系列在此插件内列出的artifacts ,将他们copy到一个特殊的地方,重命名或者去除其版本信息。这个可以解决远程仓库存在但是本地仓库不存在的依赖问题,copy操作可以用来将某个(些)maven artifact(s)拷贝到某个目录下。比如把junit拷到libs目录下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.8</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<outputDirectory>${project.build.directory}/libs</outputDirectory>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
unpack :unpack和copy类似,只不过它会把拷来的包来,按上面的配置修改goal标签的内容为unpack即可。
copy-dependencies:和copy有点类似,但是它是用来拷当前工程的依赖包的,典型的,例如我们有一个web应用,当打成war包的时候,它所有的依赖也需要被打到应用中。
maven-surefire-plugin 执行测试
目标:test
包含和排除特定的测试类
surefire默认的查找测试类的模式如:
*/Test.java
**/*Test.java
**/*TestCase.java
自定义包含和排除模式,支持ant-style表达式和 正则表达式(%regex[…], 按.class文件匹配而不是.java)
<includes>
<include>Sample.javainclude>
<include>%regex[.*[Cat|Dog].*Test.*]include>
<includes>
<excludes>
<exclude>**/TestCircle.javaexclude>
<exclude>**/TestSquare.javaexclude>
<excludes>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.16</version>
<configuration>
<includes>
<include>**/*Test.java</include>
</includes>
<skip>false</skip> <!--是否忽略测试失败-->
<testFailureIgnore>false</testFailureIgnore> <!--为true时,忽略测试失败, 仍然希望能继续构建项目-->
</configuration>
</plugin>
maven-jar-plugin 构建JAR项目
目标:jar
作用:打包(jar)插件,设定 MAINFEST .MF文件的参数,比如指定运行的Main class、将依赖的jar包加入classpath中等等
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive> <!-- 存档 -->
<addMavenDescriptor/> <!-- 添加maven 描述 -->
<compress/> <!-- 压缩 -->
<forced/> <!-- 是否强制重建存档,默认为true -->
<index/>
<manifest> <!-- 配置清单(MANIFEST)-->
<addClasspath/> <!-- 添加到classpath 开关 -->
<addDefaultImplementationEntries/>
<addDefaultSpecificationEntries/>
<addExtensions/> <!--是否创建Extension-List清单条目,默认false-->
<classpathLayoutType/> <!--在创建的Class-Path中格式化条目时要使用的布局类型(3个值simple、repository、custom,默认为simple) -->
<classpathMavenRepositoryLayout/>
<classpathPrefix/> <!-- classpath 前缀 -->
<customClasspathLayout/>
<mainClass/> <!-- 程序主函数入口 -->
<packageName/> <!-- 打包名称 -->
<useUniqueVersions/> <!-- 使用唯一版本 -->
</manifest>
<manifestEntries> <!-- 配置清单(MANIFEST)属性 -->
<key>value</key>
</manifestEntries>
<manifestFile/> <!-- MANIFEST 文件位置 -->
<manifestSections>
<manifestSection>
<name/>
<manifestEntries>
<key>value</key>
</manifestEntries>
<manifestSection/>
</manifestSections>
<pomPropertiesFile/>
</archive>
<excludes> <!-- 过滤掉不希望包含在jar中的文件 -->
<exclude/>
</excludes>
<includes> <!-- 添加文件到jar中的文件 -->
<include/>
</includes>
</configuration>
</plugin>
maven-war-plugin 构建WAR项目
目标: war
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.0.2</version>
<configuration>
<webResources>
<resource>
<filtering>true</filtering>
<directory>${project.basedir}/src/main/webapp/WEB-INF</directory>
<includes>
<include>**/*.txt</include>
<include>**/*.xml</include>
<include>**/*.properties</include>
</includes>
<excludes>
<exclude>/static</exclude>
</excludes>
<targetPath>WEB-INF</targetPath>
</resource>
</webResources>
<warName>platform</warName> <!-- war包名字——platform.war>
<webappDirectory>${project.build.directory}/platform</webappDirectory> <!-- 产生war前,用于存放构建war包的目录——target/platform -->
<warSourceDirectory>WebContent</warSourceDirectory> <!--maven默认产生的是webapp目录,这里可以设置为WebContent-->
</configuration>
</plugin>
maven-enforcer-plugin 定义规则并强制要求项目遵守
目标:enforce
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-enforcer-plugin</artifactId>
<version>1.4.1</version>
<executions>
<execution>
<id>enforce</id> <!-- 一个执行实例的id -->
<phase>validate</phase>
<goals>
<goal>display-info</goal>
<goal>enforce</goal>
</goals>
</execution>
</executions>
<configuration>
<!--规则检查不通过就构建失败;Default:false. -->
<failFast>true</failFast>
<fail>true</fail>
<ignoreCache>true</ignoreCache>
<rules>
<!-- 有冲突则终止 -->
<!--<DependencyConvergence/>-->
<bannedDependencies>
<!--是否检查传递性依赖(间接依赖)-->
<searchTransitive>true</searchTransitive>
<excludes>
<!-- JDK1.8 require -->
<exclude>org.aspectj:aspectjweaver:(,1.8.0)</exclude>
<!--upgrade require-->
<exclude>com.alibaba:fastjson</exclude>
</excludes>
</bannedDependencies>
</rules>
</configuration>
</plugin>
更多推荐



所有评论(0)