maven插件(1) - 使用插件

1. 前言

Maven is - at its heart - a plugin execution framework; all work is done by plugins.

maven实际上一个插件执行框架,所有的工作实际上都是通过插件完成,一个插件通常提供若干目标(goal),通过如下形式的命令执行插件目标:
mvn [plugin name]:[goal name]

例如可以通过编译插件compiler去编译目标,命令如下:
mvn compiler:compile

插件类型
插件有两类:

插件类型 解释
build plugins build项目时期执行这类插件,且这类插件必须配置在pom的<build></build>中
report plugins mvn site期间执行的插件,用于生成项目报表文档之类的,需要配置在pom的<reporting></reporting>之间

由于我从来没有用过report plugin,所以本文只会讲build plugins。

2. 生命周期

maven是一种基于构建生命周期(build lifecycle)的项目构建工具, 也就是说一个项目的构建和发布是要经历几个过程的,目前主要包含三个过程:

  1. clean
  2. default
  3. site

这其中每一个过程又有若干个阶段(phase)组成。下面列表只是简单列出了开发者比较常见的phase:
1. clean

phase 解释
clean 起初之前一起build生成的文件

2. default

phase 解释
validate 对项目的必要信息或资源进行验证
initialize 初始化操作,比如常见目录,设置属性
compile 编译源文件
test 使用测试框架跑所有测试用例
package 打包项目
install 部署到本地repository
deploy 发布到远程仓库
phase 解释
site 生成项目文档的网页资源

3. site

phase 解释
site 生成项目文档的网页资源

使用过mvn的就会发现,一个phase对应一个mvn的命令,比如当执行mvn compile命令时就是执行该phase之前的所有phase。
但是前言中说过mvn是通过插件来执行任务的,当执行mvn compile这个phase时,实际上是执行绑定在compile这个phase上的插件目标,由于compile这个phase默认绑定了compiler: compile(compiler插件的compile目标),因此执行mvn compile等于去执行了mvn compiler:compile

再例如:执行mvn package 实际上执行了插件mvn jar:jar(注意此处假设pom里配置了<packaging>jar<package>), 因为package这个phase默认绑定了jar:jar这个插件目标。

附:
这一节只是简单介绍了插件构建的生命周期一个,省略了一些内容,更多的细节请参考官方文档介绍mvn 生命周期

3. 插件配置

本文只介绍build plugin, build plugin需要写在pom文件的<build></build>中,
一个插件通常包含如下配置:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <build>
    ...
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.6</version>
        <extensions>false</extensions>
        <inherited>true</inherited>
        <configuration>
          <classifier>test</classifier>
        </configuration>
        <dependencies>...</dependencies>
        <executions>...</executions>
      </plugin>
    </plugins>
  </build>
</project>
  1. 一个<plugin></plugin>表示一个插件, <groupId>,<artifactId>,<version>都是引入必要配置。插件本质上托管在mvn仓库里。
  2. <inherited>表示是否当前pom的子pom中继承这个插件配置,true表示子pom继承父pom这个插件配置,那么你就可以在子pom上通过mvn命令使用这个插件
  3. <configuration>中包含了插件类实例化时用于初始化类成员信息
  4. <dependencies>, 插件自身也会依赖外部包,<dependencies>中可以为插件指定特定的依赖包, 引入方式如下:
     <dependencies>
       <dependency> 
           <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
      </dependency>
     </dependencies>
    
  5. <executions>, 一个插件可能包含多个goal,<executions>中可以单独为某个goal指定配置,以及将goal绑定到某个phase。executions包含的elements如下:
    <executions>
           <execution>
             <!--需要在<executions>里面唯一的id-->
             <id></id>
              <!--列出需要特定去配置的所有goal-->
             <goals>
               <goal>run</goal>
             </goals>
             <!--将这些goal绑定到phase-->
             <phase>verify</phase>
             <!--指定子pom是否继承这些配置-->
             <inherited>false</inherited>
             <configuration>
               <!--这里指定配置-->
             </configuration>
           </execution>
           <execution>
             ...
           </execution>
           ...
    </executions>
    

一个示例
比如下面就是一个几乎所有人都会用到的插件配置,compiler:

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>3.5.1</version>  <!--指定compiler插件版本信息-->
       <configuration>
           <!--插件实例化参数,这个参数是设置javac -source的值-->
          <source>1.7</source>  
           <!--插件实例化参数,这个参数是设置javac -target的值-->
          <target>1.7</target>
       </configuration>
</plugin>

这里没有指定<executions>,因为compiler插件的目标compile默认被绑定到compile这个phase上了,
目标testCompile被绑定到了test-compile这个phase上了。
当然你可以显式指定,加入如下配置即可:
<executions>
        <execution>
              <id>compile</id>
              <goals>
                  <goal>compile</goal>
             </goals>
             <phase>compile</phase>
        </execution>
        <execution>
             <id>testCompile</id>
             <phase>test-compile</phase>
             <goals>
                 <goal>testCompile</goal>
             </goals>
       </execution>
 </executions>

所以当执行mvn compile时其实执行了插件目标mvn compiler:compile,执行mvn test-compile时执行了插件目标mvn compiler:testCompile.

  1. 关于插件参数配置参考guide-configuring-plugins
  2. 关于pom中使用插件参考plugins in pom
  3. 关于maven插件列表参考available plugins
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • 所有项目的构建都是有生命周期的,这个生命周期包括:项目清理、初始化、编译、测试、打包、集成测试、验证、部署、站点生...
    zlcook阅读 2,767评论 0 21
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • Maven编译代码的相关命令 第一、main目录下的主代码编写完毕后,使用Maven进行编译,在项目根目录下运行命...
    加油小杜阅读 1,182评论 0 2
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注释 参考 0 前言 什么是...
    seyvoue阅读 12,589评论 1 36
  • 什么是构建生命周期 Maven的构建过程被分解为构建生命周期、阶段和目标。一个构建周期由一系列的构建阶段组成,每一...
    欧余山南阅读 867评论 0 0