Maven 插件編寫 之 Mojo

1.Maven

Maven 作為一個(gè)優(yōu)秀的項(xiàng)目管理工具蚪战,其插件機(jī)制為其功能擴(kuò)展提供了非常大的便捷性饭弓。雖然說大多數(shù)情況下废士,我們可能不太會(huì)自己去編寫 Maven 插件淋肾,但不排除在某些特殊的情況下硫麻,我們需要去完成一個(gè)自己的插件,來協(xié)助我們處理某些比較通用的事情樊卓。

2.Maven 插件的命名規(guī)范

一般來說庶香,我們會(huì)將自己的插件命名為<myplugin>-maven-plugin,而不推薦使用maven-<myplugin>-plugin简识,因?yàn)楹笳呤?Maven 團(tuán)隊(duì)維護(hù)官方插件的保留命名方式赶掖,使用這個(gè)命名方式會(huì)侵犯 Apache Maven 商標(biāo)感猛。

3.什么是 Mojo?

Mojo 就是Maven plain Old Java Object奢赂。每一個(gè) Mojo 就是 Maven 中的一個(gè)執(zhí)行目標(biāo)(executable goal)陪白,而插件則是對(duì)單個(gè)或多個(gè)相關(guān)的 Mojo 做統(tǒng)一分發(fā)。一個(gè) Mojo 包含一個(gè)簡(jiǎn)單的 Java 類膳灶。插件中多個(gè)類似 Mojo 的通用之處可以使用抽象父類來封裝咱士。

4.創(chuàng)建 Mojo 工程

mojo項(xiàng)目

這里,我們使用 idea 作為開發(fā)工具進(jìn)行講解轧钓,創(chuàng)建工程選擇 Maven序厉,然后在模板中找到 maven-archetype-plugin,點(diǎn)擊下一步毕箍,輸入對(duì)應(yīng)的參數(shù)弛房,如:io.fredia/test-maven-plugin/1.0-SNAPSHOT,最后點(diǎn)擊完成即可創(chuàng)建一個(gè)簡(jiǎn)單的 Mojo 工程而柑。

創(chuàng)建完成后文捶,工程內(nèi)會(huì)生成對(duì)應(yīng)的 pom.xml 文件。其內(nèi)容比較簡(jiǎn)單媒咳,與普通 Maven 工程的 pom.xml 基本一致粹排,只是自動(dòng)添加了對(duì) maven-plugin-api 的依賴,這個(gè)依賴?yán)锩鏁?huì)包含一些 Mojo 的接口與抽象類涩澡,在后續(xù)編寫具體的 Mojo 時(shí)再進(jìn)行詳細(xì)講解顽耳。

<dependency>
  <groupId>org.apache.maven</groupId>
  <artifactId>maven-plugin-api</artifactId>
  <version>2.0</version>
</dependency>
<dependency>
   <groupId>org.apache.maven.plugin-tools</groupId>
   <artifactId>maven-plugin-annotations</artifactId>
   <version>3.2</version>
</dependency>

注意打包方式:

<packaging>maven-plugin</packaging>

5.Mojo 的創(chuàng)建

工程創(chuàng)建完畢后,創(chuàng)建一個(gè)簡(jiǎn)單MoJo

package io.fredia.test;

/*
 * Copyright 2001-2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;

/**
 * Goal which touches a timestamp file.
 *
 * @deprecated Don't use!
 */
@Mojo(name = "hello", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {
    /**
     * Location of the file.
     */
    /*
     * @Parameter(defaultValue = "${project.build.directory}", property =
     * "outputDir", required = true) private File outputDirectory;
     */

    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("hello world");
    }
}

解釋一下這個(gè)類妙同,我們發(fā)現(xiàn)它繼承了 AbstractMojo 這個(gè)抽象類射富,并實(shí)現(xiàn)了 execute() 方法,該方法就是用來定義這個(gè) Mojo 具體操作內(nèi)容渐溶,我們只需要根據(jù)自己的需要來編寫自己的實(shí)現(xiàn)即可辉浦。

Mojo 操作的實(shí)現(xiàn)我們了解了弄抬,那怎么讓 Maven 知道這是一個(gè) Mojo 而不是一個(gè)普通的 Java 類呢茎辐?這里,就需要說一下 Mojo 的查找機(jī)制了掂恕,在處理源碼的時(shí)候拖陆,plugin-tools 會(huì)把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注釋的類來當(dāng)作一個(gè) Mojo 類。在上面的例子中懊亡,我們使用了 @MoJo 的方法來聲明一個(gè) Mojo依啰。同樣我們也可以使用 Javadoc 注解來進(jìn)行聲明:

/**
 * @goal hello
 */
public class MyMojo extends AbstractMojo {

    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("hello fredia");
    }

}

6.如何運(yùn)行自定義 Plugin

與使用其它插件類似,我們需要在 pom.xml 文件中引入插件:

<build>
    <plugins>
        <plugin>
            <groupId>io.fredia</groupId>
            <artifactId>test-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
        </plugin>
    </plugins>
</build>

mvn命令行執(zhí)行如下:

mvn io.fredia:test-maven-plugin:1.0-SNAPSHOT:hello

即可看到輸出:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building test-maven-plugin Maven Mojo 1.0-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- test-maven-plugin:1.0-SNAPSHOT:hello (default-cli) @ test-maven-plugin ---
hello fredia
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.249 s
[INFO] Finished at: 2017-11-22T12:59:47+08:00
[INFO] Final Memory: 6M/123M
[INFO] ------------------------------------------------------------------------

7.縮短執(zhí)行命令

在剛才運(yùn)行插件的時(shí)候店枣,我們使用全量的插件指引速警,但這個(gè)實(shí)在是太長(zhǎng)太繁瑣了叹誉,那我們是否可以縮短我們的執(zhí)行命令呢?答案肯定是可以的闷旧,如果你想要執(zhí)行的是你本地庫中最新版本的插件长豁,那么你可以刪除掉版本號(hào);如果你的命名滿足前面提及的兩種命令方式忙灼,你可以直接使用插件名及 goal 名來運(yùn)行對(duì)應(yīng)的插件匠襟,如:

mvn test:hello

結(jié)果一樣

8.綁定 Maven 執(zhí)行周期

你還可以將插件配置為將特定目標(biāo),從而附加到構(gòu)建生命周期中的某個(gè)特定階段该园。如:

<build>
    <plugins>
        <plugin>
            <groupId>io.fredia</groupId>
            <artifactId>test-maven-plugin</artifactId>
            <version>1.0-SNAPSHOT</version>
            <executions>
                <execution>
                    <goals>
                        <goal>hello</goal>
                    </goals>
                    <phase>package</phase>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

最后附加一個(gè)自己基于maven-plugin開發(fā)的代碼生成器酸舍,實(shí)現(xiàn)高度的代碼復(fù)用和全自動(dòng)化

gitee地址:https://gitee.com/fredia/code-factory/ 望多多支持

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市里初,隨后出現(xiàn)的幾起案子啃勉,更是在濱河造成了極大的恐慌,老刑警劉巖青瀑,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件璧亮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡斥难,警方通過查閱死者的電腦和手機(jī)枝嘶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哑诊,“玉大人群扶,你說我怎么就攤上這事《瓶悖” “怎么了竞阐?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)暑劝。 經(jīng)常有香客問我骆莹,道長(zhǎng),這世上最難降的妖魔是什么担猛? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任幕垦,我火速辦了婚禮,結(jié)果婚禮上傅联,老公的妹妹穿的比我還像新娘先改。我一直安慰自己,他們只是感情好蒸走,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布仇奶。 她就那樣靜靜地躺著,像睡著了一般比驻。 火紅的嫁衣襯著肌膚如雪该溯。 梳的紋絲不亂的頭發(fā)上岛抄,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音狈茉,去河邊找鬼弦撩。 笑死,一個(gè)胖子當(dāng)著我的面吹牛论皆,可吹牛的內(nèi)容都是我干的益楼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼点晴,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼感凤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起粒督,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤陪竿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后屠橄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體族跛,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锐墙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了礁哄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡溪北,死狀恐怖桐绒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情之拨,我是刑警寧澤茉继,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站蚀乔,受9級(jí)特大地震影響烁竭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吉挣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一派撕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧听想,春花似錦腥刹、人聲如沸马胧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佩脊。三九已至蛙粘,卻和暖如春垫卤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背出牧。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工穴肘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人舔痕。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓评抚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親伯复。 傳聞我的和親對(duì)象是個(gè)殘疾皇子慨代,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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