最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用maven自定義插件開發(fā)

 更新時(shí)間:2022年06月15日 10:40:39   作者:Garfield_cat_cat  
這篇文章主要介紹了使用maven自定義插件開發(fā),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Maven 作為一個(gè)優(yōu)秀的項(xiàng)目管理工具,其插件機(jī)制為其功能擴(kuò)展提供了非常大的便捷性。

雖然說大多數(shù)情況下,我們可能不太會(huì)自己去編寫 Maven 插件,但不排除在某些特殊的情況下,我們需要去完成一個(gè)自己的插件,來協(xié)助我們處理某些比較通用的事情。

正好,最近有一些需求可能需要對(duì) Drools 的一個(gè) Maven 插件進(jìn)行擴(kuò)展,所以學(xué)習(xí)一下 Maven 的插件編寫。

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

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

什么是 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 的通用之處可以使用抽象父類來封裝。

創(chuàng)建 Mojo 工程

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

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

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

什么是 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 的通用之處可以使用抽象父類來封裝。

創(chuàng)建 Mojo 工程

這里,我們使用 Idea 作為開發(fā)工具進(jìn)行講解,創(chuàng)建工程選擇 Maven,然后在模板中找到 maven-archetype-mojo,點(diǎn)擊下一步,輸入對(duì)應(yīng)的參數(shù),如:com.qchery/ekjar-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>

與普通 pom.xml 文件一個(gè)重要的不同之處是它的打包方式:

<packaging>maven-plugin</packaging>

簡(jiǎn)單 Mojo 的創(chuàng)建

工程創(chuàng)建完畢后,我們開始 Mojo 創(chuàng)建之旅,上面提到過 Mojo 是一個(gè)簡(jiǎn)單的 Java 類,那我們創(chuàng)建第一個(gè) Mojo 類用于打印一行輸出。

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
/**
?* @goal hello
?*/
public class HelloMojo extends AbstractMojo {
? ? 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 類。在上面的例子中,我們使用了 Javadoc 的方法來聲明一個(gè) Mojo。同樣我們也可以使用 @Mojo 注解來進(jìn)行聲明:

@Mojo(name = "hello")
public class HelloMojo extends AbstractMojo {
? ? public void execute() throws MojoExecutionException, MojoFailureException {
? ? ? ? System.out.println("hello world");
? ? }
}

使用 @Mojo 注解,我們需要引入一個(gè)新包:

<dependency>
? <groupId>org.apache.maven.plugin-tools</groupId>
? <artifactId>maven-plugin-annotations</artifactId>
? <version>3.1</version>
</dependency>

運(yùn)行自定義 Plugin

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

<build>
? ? <plugins>
? ? ? ? <plugin>
? ? ? ? ? ? <groupId>com.qchery</groupId>
? ? ? ? ? ? <artifactId>ekjar-maven-plugin</artifactId>
? ? ? ? ? ? <version>1.0-SNAPSHOT</version>
? ? ? ? </plugin>
? ? </plugins>
</build>

先執(zhí)行命令:

mvn install

然后執(zhí)行:

mvn com.qchery:ekjar-maven-plugin:1.0-SNAPSHOT:hello

即可看到輸出:

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

縮短執(zhí)行命令

在剛才運(yùn)行插件的時(shí)候,我們使用全量的插件指引,但這個(gè)實(shí)在是太長太繁瑣了,那我們是否可以縮短我們的執(zhí)行命令呢?

答案肯定是可以的,如果你想要執(zhí)行的是你本地庫中最新版本的插件,那么你可以刪除掉版本號(hào);如果你的命名滿足前面提及的兩種命令方式,你可以直接使用插件名及 goal 名來運(yùn)行對(duì)應(yīng)的插件,如:

mvn ekjar:hello

你會(huì)得到與之前完全一樣的結(jié)果。

綁定 Maven 執(zhí)行周期

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

<build>
? ? <plugins>
? ? ? ? <plugin>
? ? ? ? ? ? <groupId>com.qchery</groupId>
? ? ? ? ? ? <artifactId>ekjar-maven-plugin</artifactId>
? ? ? ? ? ? <version>1.0-SNAPSHOT</version>
? ? ? ? ? ? <executions>
? ? ? ? ? ? ? ? <execution>
? ? ? ? ? ? ? ? ? ? <goals>
? ? ? ? ? ? ? ? ? ? ? ? <goal>hello</goal>
? ? ? ? ? ? ? ? ? ? </goals>
? ? ? ? ? ? ? ? ? ? <phase>package</phase>
? ? ? ? ? ? ? ? </execution>
? ? ? ? ? ? </executions>
? ? ? ? </plugin>
? ? </plugins>
</build>

繼承AbstractMojo 的類中,參數(shù)可以通過命令賦值,例如:

/**
?*
?* @goal echo
?* @phase process-sources
?*/
public class MyMojo extends AbstractMojo {
? ? /**
? ? ?* @parameter expression="${echo.message}" default-value="Hello World..."
? ? ?*/
? ? private String message;
? ? public void execute() throws MojoExecutionException, MojoFailureException {
? ? ? ? System.out.println("hello world");
? ? ? ? getLog().info("hello mymojo : "+message);
? ? }
}

其中注釋就是maven插件很重要的元數(shù)據(jù)

/**
?* @goal CustomMavenMojo:表示該插件的服務(wù)目標(biāo)
?* @phase compile:表示該插件的生效周期階段
?* @requiresProject false:表示是否依托于一個(gè)項(xiàng)目才能運(yùn)行該插件
?* @parameter expression="${name}":表示插件參數(shù),使用插件的時(shí)候會(huì)用得到
?* @required:代表該參數(shù)不能省略
?*/

執(zhí)行:

mvn com.handarui.yanquan:yanquan:1.0-SNAPSHOT:echo -Decho.message="The Eagle has Landed"

(MyMojo類中的message 參數(shù)的javadoc注釋是 echo.message, 通過命令賦值時(shí),需要傳入-Decho.message=XXX 這種形式 )

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • mybatis模糊查詢like語句該如何寫

    mybatis模糊查詢like語句該如何寫

    MyBatis模糊查詢通常使用LIKE關(guān)鍵字,結(jié)合concat函數(shù)拼接通配符%實(shí)現(xiàn),在MyBatis配置文件中,通過#{keyword}傳遞參數(shù),生成帶有通配符的查詢語句,MyBatis-Plus中,通過LambdaQueryWrapper類和like方法構(gòu)建模糊查詢條件,簡(jiǎn)化查詢操作
    2024-09-09
  • Java實(shí)現(xiàn)上傳文件到服務(wù)器的示例代碼

    Java實(shí)現(xiàn)上傳文件到服務(wù)器的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何使用Java實(shí)現(xiàn)上傳文件到服務(wù)器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-04-04
  • Springboot為什么加載不上application.yml的配置文件

    Springboot為什么加載不上application.yml的配置文件

    這篇文章主要介紹了Springboot為什么加載不上application.yml的配置文件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Maven打包的三種方式小結(jié)

    Maven打包的三種方式小結(jié)

    這篇文章給大家介紹了三種Maven打包的方式,使用maven-jar-plugin,使用maven-assembly-plugin和使用maven-shade-plugin這三種方式,通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java程序員面試中的多線程問題總結(jié)

    Java程序員面試中的多線程問題總結(jié)

    這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級(jí)工程師所問到。這篇文章收集了 Java 線程方面一些典型的問題,這些問題經(jīng)常被高級(jí)工程師所問到。
    2016-11-11
  • Mybatis控制臺(tái)打印SQL語句的兩種實(shí)現(xiàn)方式

    Mybatis控制臺(tái)打印SQL語句的兩種實(shí)現(xiàn)方式

    在使用Mybatis開發(fā)時(shí),由于可以動(dòng)態(tài)拼接SQL,當(dāng)動(dòng)態(tài)SQL拼接塊過多,直接從*mapper.xml中找出完整的SQL較難,此時(shí),可以通過兩種方法調(diào)試出SQL,方法一,將ibatislog4j運(yùn)行級(jí)別調(diào)到DEBUG,在控制臺(tái)打印出ibatis運(yùn)行的SQL語句
    2024-10-10
  • SpringBoot中Redis的緩存更新策略詳解

    SpringBoot中Redis的緩存更新策略詳解

    這篇文章主要介紹了SpringBoot中Redis的緩存更新策略,緩存一般是為了應(yīng)對(duì)高并發(fā)場(chǎng)景、緩解數(shù)據(jù)庫讀寫壓力,而將數(shù)據(jù)存儲(chǔ)在讀寫更快的某種存儲(chǔ)介質(zhì)中(如內(nèi)存),以加快讀取數(shù)據(jù)的速度,需要的朋友可以參考下
    2023-08-08
  • java數(shù)據(jù)結(jié)構(gòu)之希爾排序

    java數(shù)據(jù)結(jié)構(gòu)之希爾排序

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)之希爾排序的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • SpringBoot整合Logback日志框架及高并發(fā)下的性能優(yōu)化

    SpringBoot整合Logback日志框架及高并發(fā)下的性能優(yōu)化

    在現(xiàn)代的Java應(yīng)用開發(fā)中,日志記錄是不可或缺的一部分,Spring Boot作為目前最流行的Java開發(fā)框架之一,默認(rèn)集成了Logback作為日志框架,Logback是Log4j的繼任者,具有更高的性能和更豐富的功能,本文將詳細(xì)介紹如何在Spring Boot中整合Logback日志框架
    2025-03-03
  • java.io.NotSerializableException異常的問題及解決

    java.io.NotSerializableException異常的問題及解決

    這篇文章主要介紹了java.io.NotSerializableException異常的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論

嵊州市| 额济纳旗| 松江区| 南漳县| 资中县| 鄂尔多斯市| 清新县| 蓬莱市| 年辖:市辖区| 富裕县| 土默特右旗| 芦溪县| 内黄县| 明溪县| 永新县| 江西省| 敦化市| 文安县| 连州市| 文水县| 平果县| 建德市| 体育| 镇平县| 长子县| 石首市| 武威市| 洪湖市| 水城县| 九江县| 渝中区| 军事| 嘉兴市| 鱼台县| 汽车| 乌审旗| 闽侯县| 金川县| 辽阳县| 陈巴尔虎旗| 德保县|