maven生命周期和插件

目录

基础概念

生命周期

插件

maven-clean-plugin 清理项目

maven-compiler-plugin 编译项目

maven-deploy-plugin 部署项目

maven-install-plugin 安装项目

maven-resources-plugin 处理资源文件

maven-site-plugin 生成站点

maven-dependency-plugin 依赖分析及控制

maven-surefire-plugin 执行测试

maven-jar-plugin 构建JAR项目

maven-war-plugin 构建WAR项目

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生命周期,每个生命周期执行的内容包含:

precleanvalidate
cleancompile
 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>

 

更多推荐