maven插件開(kāi)發(fā)

最近接到了一個(gè)開(kāi)發(fā)maven插件的需求,就學(xué)習(xí)了一下,做一下總結(jié),也分享給大家,讓大家少百度一點(diǎn)資料,多學(xué)習(xí)一點(diǎn)知識(shí)。

  1. 選中maven插件模板


  2. 為你的maven插件起個(gè)名字

這里建議起名規(guī)則為 你的插件功能+maven-plugin

  1. pom依賴(lài)升級(jí)

這里可以注意一下,maven插件的打包方式不是我們常見(jiàn)的jar,pom,war而是maven-plugin,這里看一眼就行了......

刪掉原來(lái)的依賴(lài),原來(lái)的依賴(lài)版本太低了,并且整個(gè)項(xiàng)目是以java6為基礎(chǔ)的,不支持java8的一些新特性,我們需要替換一下配置。


    <dependencies>
        <dependency>
            <groupId>org.apache.maven</groupId>
            <artifactId>maven-plugin-api</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.maven.plugin-tools</groupId>
            <artifactId>maven-plugin-annotations</artifactId>
            <version>3.5.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.5.2</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

  1. 編輯啟動(dòng)類(lèi)
    maven提供了一個(gè)抽象類(lèi)供我們繼承,然后我們將插件的功能編寫(xiě)到方法體中就可以了。idea替我們生成的部分代碼如下:

    注釋中的@goal表示插件指令的名稱(chēng),就像clean,install那些指令一樣。

為什么會(huì)在注釋中寫(xiě)這個(gè)指令,而不是注解中?
這是因?yàn)閙aven早于jdk 1.5 出現(xiàn)的,注解是jdk 1.5之后才出現(xiàn)的,所以,maven沒(méi)有辦法只能在注釋中寫(xiě),并通過(guò)掃描源碼實(shí)現(xiàn)類(lèi)似注解一樣的功能。剛剛我們已經(jīng)將依賴(lài)的版本升級(jí)成3.5.2了,這個(gè)版本是支持使用注解的,所以我們可以刪掉原來(lái)的注釋?zhuān)米⒔馊〈?/p>

調(diào)整后,我們的代碼是這樣的

@Mojo(name = "hello-world")
public class HelloWorldMojo extends AbstractMojo {

    @Override
    public void execute() throws MojoExecutionException {
        // todo 自定義功能
    }
}

我們將我們的插件功能編寫(xiě)到execute方法中就可以了

  1. 日志打印
    maven將日志對(duì)象封裝在了我們繼承的那個(gè)抽象類(lèi)中,我們通過(guò)getLog()即可或者這個(gè)對(duì)象。

但是我們?cè)趯?shí)際開(kāi)發(fā)中,從工程學(xué)的角度講,不會(huì)將所有的邏輯都放在一個(gè)方法里面,需要對(duì)功能進(jìn)行細(xì)分,每個(gè)類(lèi)負(fù)責(zé)一些功能,所以我們想在任何類(lèi)都可以打日志,所以,我這里寫(xiě)了一個(gè)全局的日志類(lèi),然后通過(guò)靜態(tài)方法獲取日志打印對(duì)象。

public abstract class Logger {
    
    private static Log log;
    
    public static void setLog(Log log){
        Logger.log = log;
    }
    
    public static void info(String msg){
        log.info(msg);
    }
    
    public static void debug(String msg){
        log.debug(msg);
    }
    
    public static void warn(String msg){
        log.warn(msg);
    }
    
    public static void error(String msg){
        log.error(msg);
    }
}

execute方法的第一行對(duì)日志對(duì)象進(jìn)行賦值,這樣我們就可以在任何地方通過(guò)調(diào)用自定義的Logger方法獲取日志對(duì)象,打印日志了。

    public void execute() throws MojoExecutionException {
        Logger.setLog(getLog());
    }
  1. 配置信息
    3.1 在maven啟動(dòng)類(lèi)的屬性中標(biāo)注@Parameter注解,我們的屬性可以是String,可以是對(duì)象,也可以是List
@Mojo(name = "hello-world")
public class HelloWorldMojo extends AbstractMojo {

    @Parameter(readonly = true)
    private String helloStr;

    @Parameter(required = true)
    private List<String> scanPackages;

    @Override
    public void execute() throws MojoExecutionException {
        Logger.setLog(getLog());
        Logger.info(helloStr);
    }
}

3.2 使用maven的變量
通過(guò)在@Paramter中的defaultValue使用${maven變量名稱(chēng)}使用maven變量。

@Mojo(name = "hello-world")
public class GlossaryCheckerMojo extends AbstractMojo {

    @Parameter(defaultValue = "${project.basedir}", readonly = true)
    private File basedir;
}

對(duì)應(yīng)的maven配置

            <plugin>
                <groupId>org.ywb</groupId>
                <artifactId>hello-world-maven-plugin</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <helloStr>hello-plugin</helloStr>
                    <scanPackages>
                        <scanPackage>org.ywb.hello</scanPackage>
                        <scanPackage>org.ywb.hello1</scanPackage>
                    </scanPackages>
                </configuration>
            </plugin>

3.3 maven插件發(fā)布

  1. 源碼安裝
    直接通過(guò)idea的install指令即可安裝到本地


  2. 通過(guò)maven 指令安裝
    先通過(guò)package將插件打包,然后手動(dòng)執(zhí)行maven-install指令
mvn install:install-file 
-Dfile="xxxxx/hello-world-maven-plugin-1.0.0.jar" 
-DgroupId="org.ywb" 
-DartifactId="hello-world-maven-plugin" 
-Dversion="1.0.0" 
-Dpackaging=jar

附錄

maven 插件開(kāi)發(fā)常用的工具

  1. java SPI
    java的SPI機(jī)制類(lèi)似于Spring框架,可以對(duì)對(duì)象進(jìn)行管理,可以看下面這個(gè)博客學(xué)習(xí)使用
    https://www.cnblogs.com/jy107600/p/11464985.html
  2. 源碼解析工具,qdox
    如果我們開(kāi)發(fā)插件的時(shí)候,需要獲取類(lèi)的一些信息,qdox真的非常好用!大家可以看這個(gè)鏈接
    https://zhuanlan.zhihu.com/p/115606527
參考資料:
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容