maven插件(1) - 使用插件

1. 前言

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

maven實(shí)際上一個(gè)插件執(zhí)行框架提鸟,所有的工作實(shí)際上都是通過(guò)插件完成,一個(gè)插件通常提供若干目標(biāo)(goal),通過(guò)如下形式的命令執(zhí)行插件目標(biāo):
mvn [plugin name]:[goal name]

例如可以通過(guò)編譯插件compiler去編譯目標(biāo),命令如下:
mvn compiler:compile

插件類型
插件有兩類:

插件類型 解釋
build plugins build項(xiàng)目時(shí)期執(zhí)行這類插件,且這類插件必須配置在pom的<build></build>中
report plugins mvn site期間執(zhí)行的插件上沐,用于生成項(xiàng)目報(bào)表文檔之類的,需要配置在pom的<reporting></reporting>之間

由于我從來(lái)沒(méi)有用過(guò)report plugin,所以本文只會(huì)講build plugins赋朦。

2. 生命周期

maven是一種基于構(gòu)建生命周期(build lifecycle)的項(xiàng)目構(gòu)建工具, 也就是說(shuō)一個(gè)項(xiàng)目的構(gòu)建和發(fā)布是要經(jīng)歷幾個(gè)過(guò)程的,目前主要包含三個(gè)過(guò)程:

  1. clean
  2. default
  3. site

這其中每一個(gè)過(guò)程又有若干個(gè)階段(phase)組成。下面列表只是簡(jiǎn)單列出了開(kāi)發(fā)者比較常見(jiàn)的phase:
1. clean

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

2. default

phase 解釋
validate 對(duì)項(xiàng)目的必要信息或資源進(jìn)行驗(yàn)證
initialize 初始化操作宠哄,比如常見(jiàn)目錄壹将,設(shè)置屬性
compile 編譯源文件
test 使用測(cè)試框架跑所有測(cè)試用例
package 打包項(xiàng)目
install 部署到本地repository
deploy 發(fā)布到遠(yuǎn)程倉(cāng)庫(kù)
phase 解釋
site 生成項(xiàng)目文檔的網(wǎng)頁(yè)資源

3. site

phase 解釋
site 生成項(xiàng)目文檔的網(wǎng)頁(yè)資源

使用過(guò)mvn的就會(huì)發(fā)現(xiàn),一個(gè)phase對(duì)應(yīng)一個(gè)mvn的命令毛嫉,比如當(dāng)執(zhí)行mvn compile命令時(shí)就是執(zhí)行該phase之前的所有phase诽俯。
但是前言中說(shuō)過(guò)mvn是通過(guò)插件來(lái)執(zhí)行任務(wù)的,當(dāng)執(zhí)行mvn compile這個(gè)phase時(shí)承粤,實(shí)際上是執(zhí)行綁定在compile這個(gè)phase上的插件目標(biāo)暴区,由于compile這個(gè)phase默認(rèn)綁定了compiler: compile(compiler插件的compile目標(biāo)),因此執(zhí)行mvn compile等于去執(zhí)行了mvn compiler:compile

再例如:執(zhí)行mvn package 實(shí)際上執(zhí)行了插件mvn jar:jar(注意此處假設(shè)pom里配置了<packaging>jar<package>), 因?yàn)閜ackage這個(gè)phase默認(rèn)綁定了jar:jar這個(gè)插件目標(biāo)。

附:
這一節(jié)只是簡(jiǎn)單介紹了插件構(gòu)建的生命周期一個(gè)辛臊,省略了一些內(nèi)容仙粱,更多的細(xì)節(jié)請(qǐng)參考官方文檔介紹mvn 生命周期

3. 插件配置

本文只介紹build plugin, build plugin需要寫(xiě)在pom文件的<build></build>中,
一個(gè)插件通常包含如下配置:

<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. 一個(gè)<plugin></plugin>表示一個(gè)插件彻舰, <groupId>,<artifactId>,<version>都是引入必要配置伐割。插件本質(zhì)上托管在mvn倉(cāng)庫(kù)里。
  2. <inherited>表示是否當(dāng)前pom的子pom中繼承這個(gè)插件配置刃唤,true表示子pom繼承父pom這個(gè)插件配置隔心,那么你就可以在子pom上通過(guò)mvn命令使用這個(gè)插件
  3. <configuration>中包含了插件類實(shí)例化時(shí)用于初始化類成員信息
  4. <dependencies>, 插件自身也會(huì)依賴外部包,<dependencies>中可以為插件指定特定的依賴包尚胞, 引入方式如下:
     <dependencies>
       <dependency> 
           <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
      </dependency>
     </dependencies>
    
  5. <executions>, 一個(gè)插件可能包含多個(gè)goal济炎,<executions>中可以單獨(dú)為某個(gè)goal指定配置,以及將goal綁定到某個(gè)phase辐真。executions包含的elements如下:
    <executions>
           <execution>
             <!--需要在<executions>里面唯一的id-->
             <id></id>
              <!--列出需要特定去配置的所有g(shù)oal-->
             <goals>
               <goal>run</goal>
             </goals>
             <!--將這些goal綁定到phase-->
             <phase>verify</phase>
             <!--指定子pom是否繼承這些配置-->
             <inherited>false</inherited>
             <configuration>
               <!--這里指定配置-->
             </configuration>
           </execution>
           <execution>
             ...
           </execution>
           ...
    </executions>
    

一個(gè)示例
比如下面就是一個(gè)幾乎所有人都會(huì)用到的插件配置须尚,compiler:

<plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-compiler-plugin</artifactId>
       <version>3.5.1</version>  <!--指定compiler插件版本信息-->
       <configuration>
           <!--插件實(shí)例化參數(shù),這個(gè)參數(shù)是設(shè)置javac -source的值-->
          <source>1.7</source>  
           <!--插件實(shí)例化參數(shù)侍咱,這個(gè)參數(shù)是設(shè)置javac -target的值-->
          <target>1.7</target>
       </configuration>
</plugin>

這里沒(méi)有指定<executions>耐床,因?yàn)閏ompiler插件的目標(biāo)compile默認(rèn)被綁定到compile這個(gè)phase上了,
目標(biāo)testCompile被綁定到了test-compile這個(gè)phase上了楔脯。
當(dāng)然你可以顯式指定撩轰,加入如下配置即可:
<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>

所以當(dāng)執(zhí)行mvn compile時(shí)其實(shí)執(zhí)行了插件目標(biāo)mvn compiler:compile,執(zhí)行mvn test-compile時(shí)執(zhí)行了插件目標(biāo)mvn compiler:testCompile.

  1. 關(guān)于插件參數(shù)配置參考guide-configuring-plugins
  2. 關(guān)于pom中使用插件參考plugins in pom
  3. 關(guān)于maven插件列表參考available plugins
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昧廷,隨后出現(xiàn)的幾起案子堪嫂,更是在濱河造成了極大的恐慌,老刑警劉巖木柬,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件皆串,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡眉枕,警方通過(guò)查閱死者的電腦和手機(jī)恶复,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)怜森,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人谤牡,你說(shuō)我怎么就攤上這事副硅。” “怎么了翅萤?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵恐疲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我套么,道長(zhǎng)培己,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任违诗,我火速辦了婚禮漱凝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诸迟。我一直安慰自己茸炒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布阵苇。 她就那樣靜靜地躺著壁公,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绅项。 梳的紋絲不亂的頭發(fā)上紊册,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音快耿,去河邊找鬼囊陡。 笑死,一個(gè)胖子當(dāng)著我的面吹牛掀亥,可吹牛的內(nèi)容都是我干的撞反。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搪花,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遏片!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起撮竿,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤吮便,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后幢踏,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體髓需,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年惑折,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了授账。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片枯跑。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惨驶,死狀恐怖白热,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情粗卜,我是刑警寧澤屋确,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站续扔,受9級(jí)特大地震影響攻臀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纱昧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一刨啸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧识脆,春花似錦设联、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悉稠,卻和暖如春宫蛆,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背的猛。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工耀盗, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卦尊。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓叛拷,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親猫牡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子胡诗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 所有項(xiàng)目的構(gòu)建都是有生命周期的,這個(gè)生命周期包括:項(xiàng)目清理淌友、初始化煌恢、編譯、測(cè)試震庭、打包瑰抵、集成測(cè)試、驗(yàn)證器联、部署二汛、站點(diǎn)生...
    zlcook閱讀 2,773評(píng)論 0 21
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理婿崭,服務(wù)發(fā)現(xiàn),斷路器肴颊,智...
    卡卡羅2017閱讀 134,672評(píng)論 18 139
  • Maven編譯代碼的相關(guān)命令 第一氓栈、main目錄下的主代碼編寫(xiě)完畢后,使用Maven進(jìn)行編譯婿着,在項(xiàng)目根目錄下運(yùn)行命...
    加油小杜閱讀 1,194評(píng)論 0 2
  • 前言什么是 POMQuick Overview POM 常用元素 pom.xml 完整注釋 參考 0 前言 什么是...
    seyvoue閱讀 12,607評(píng)論 1 36
  • 什么是構(gòu)建生命周期 Maven的構(gòu)建過(guò)程被分解為構(gòu)建生命周期授瘦、階段和目標(biāo)。一個(gè)構(gòu)建周期由一系列的構(gòu)建階段組成竟宋,每一...
    歐余山南閱讀 872評(píng)論 0 0