maven之自定義插件


  Maven 是一個系統管理框架或體系,專注管理構建的生命周期和各個階段。真正工作的是綁定到各個階段的 Maven 插件。每個插件具有一個或一個以上的目標,可以將這些插件的目標綁定到 Maven 生命周期的各個階段中,或直接從命令行運行這些插件的目標。用戶可以從 Apache 和其他的參考 Maven 中心倉庫獲取。當然,這些插件基本上能滿足大部分程序員的需求,但是在特殊情況下,可能我們自己有特殊的需求,就要求我們自己去實現一個定制的插件;其實編寫插件也並不是很難很復雜的事情,接下來我們開始研究一下,怎么樣編寫看似高深的、能綁定到 Maven 生命周期的階段中自動被調用執行的 Maven 插件。

  為了方便大家對編寫 Maven 插件的方向和過程有個總體的了解,先介紹一下編寫 Maven 插件的基本步驟。

  • 創建 Maven 項目。插件的功能肯定需要編寫 Java 類的,所以插件本身就是一個 Maven 項目。當然,相對於以前研究的 Maven 項目,插件項目有它的特殊點:packaging 必須是 maven-plugin 類型,可以通過 maven-archetype-plugin 快速創建一個 Maven 插件項目。
  • 編寫插件目標。每個插件都至少包含一個目標,每個目標對應一個獨立的 Java 類。這里把這種類叫 Mojo 類(對象)。Mojo 類必須繼承 AbstractMojo 父類。
  • 設置目標的配置點。大部分 Maven 件和它的目標都是可以配置的。根據需要,可以在編寫 Mojo 的時候給它設置好可以配置的參數。
  • 編寫邏輯代碼,實現目標功能。用 Java 代碼實現插件的功能。
  • 處理錯誤和日志。當 Mojo 運行的時候發生異常時,需要根據情況控制 Maven 的運行狀況,並且用代碼實現必要的日志輸出,為用戶提供必要的提示信息。
  • 測試插件。編寫測試案例,綁定(或命令行)執行插件。

自定義插件實現:

  自定義Mojo需要繼承 AbstractMojo 這個抽象類,並實現了 execute() 方法,該方法就是用來定義這個 Mojo 具體操作內容,我們只需要根據自己的需要來編寫自己的實現即可。那么Maven 如何知道這是一個 Mojo 而不是一個普通的 Java 類呢? Mojo 的查找機制:在處理源碼的時候,plugin-tools 會把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注釋的類來當作一個 Mojo 類。我們這里使用 @Mojo 注解來進行聲明。

1.導入依賴:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wuzz.demo</groupId>
    <artifactId>wuzz-maven-plugin</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--打包方式-->
    <packaging>maven-plugin</packaging>
    <dependencies>
        <!--使用doc的方式-->
        <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>
                <!-- 插件執行命令前綴 -->
                <configuration>
                    <goalPrefix>wuzz</goalPrefix>
                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <!-- 編碼和編譯和JDK版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.Mojo實現類:

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; import org.apache.maven.plugins.annotations.Parameter; /** * @description: 類功能描述 * @author: wuzhenzhao * @time 2020/7/15 14:45 * @since 1.0 **/
// mojo注解就是maven插件的注解 // 后面配置的是生命周期,我這里配置了PACKAGE,即默認是打包時候執行本插件(這個可以在pom文件指定)
@Mojo(name = "wuzzMojo", defaultPhase = LifecyclePhase.PACKAGE) public class WuzzMojo extends AbstractMojo { // 配置的是本maven插件的配置,在pom使用configration標簽進行配置 property就是名字, // 在配置里面的標簽名字。在調用該插件的時候會看到
    @Parameter(property = "application") private String application; @Parameter(property = "sourceFolderPath") private String sourceFolderPath; @Override public void execute() throws MojoExecutionException, MojoFailureException { System.out.println( String.format("Hello World WuzzMojo: 應用名稱: %s | 當前應用根目錄: %s", application, sourceFolderPath) ); } }

3. 執行 mvn  install 。成功即可在maven倉庫下看到該jar

4.創建一個新的 maven 工程,依賴如下:

<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.wuzz.demo</groupId>
    <artifactId>maven-plugin-test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <!--引入剛剛的插件依賴-->
                <groupId>com.wuzz.demo</groupId>
                <artifactId>wuzz-maven-plugin</artifactId>
                <version>1.0-SNAPSHOT</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>wuzzMojo</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
                <!-- 這里加入的是相關參數,這些參數必須跟插件實現里面的屬性保持一致 -->
                <configuration>
                    <application>api</application><!-- 當前應用名稱 -->
                    <sourceFolderPath>${basedir}</sourceFolderPath><!-- 當前應用根目錄 -->
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

  打開Maven 界面可以看到 :

  雙擊 wuzzMojo :

   也可以執行  mvn  package 也會執行自定義插件的方法。這里是以pom文件里 phase 定義的值決定,我這里定義成 package,所以只有在打包的時候才會執行。這樣就完成了一個簡單的  maven 自定義插件

 Mojo 參數:

/** * This annotation will mark your class as a Mojo (ie. goal in a Maven plugin). * * @author Olivier Lamy * @since 3.0 */ @Documented @Retention( RetentionPolicy.CLASS ) @Target( ElementType.TYPE ) @Inherited public @interface Mojo { /** * goal name (required).唯一必須聲明的標注,當用戶命令行調用或在pom中配置插件是,需使用該目標名稱 * @return the goal name */ String name(); /**默認將該目標綁定至default聲明周期的某個階段,這樣在配置使用插件目標時,就無需聲明phase,如maven-surefire-plugin的test目標帶有@phase tes標注 * default phase to bind your mojo. * @return the default phase */ LifecyclePhase defaultPhase() default LifecyclePhase.NONE; /**在運行mojo之前必須解析所有指定范圍的依賴,如maven-surefire-plugin的test目標帶有requiresDependencyResolution test標注,表示執行測試前,所有測試范圍的依賴必須得到解析 * the required dependency resolution scope. * @return the required dependency resolution scope */ ResolutionScope requiresDependencyResolution() default ResolutionScope.NONE; /** * the required dependency collection scope. * @return the required dependency collection scope */ ResolutionScope requiresDependencyCollection() default ResolutionScope.NONE; /** * your Mojo instantiation strategy. (Only <code>per-lookup</code> and <code>singleton</code> are supported) * @return the instantiation strategy */ InstantiationStrategy instantiationStrategy() default InstantiationStrategy.PER_LOOKUP; /** * execution strategy: <code>once-per-session</code> or <code>always</code>. * @return <code>once-per-session</code> or <code>always</code> */ String executionStrategy() default "once-per-session"; /**該目標是否必須在一個maven項目中運行(如測試插件用於測試其他項目),默認為true。大部分插件目標需依賴一個項目才能運行,但是,maven-help-plugin的system目標例外,它用來顯示系統屬性和環境變量信息,無需實際項目。 * does your mojo requires a project to be executed? * @return requires a project */
    boolean requiresProject() default true; /**是否要求項目報告已經生成,默認為false * does your mojo requires a reporting context to be executed? * @return requires a reporting context */
    boolean requiresReports() default false; /**當mojo在多模塊項目上運行時,該標注表示目標只會在頂層模塊運行。 * if the Mojo uses the Maven project and its child modules. * @return uses the Maven project and its child modules */
    boolean aggregator() default false; /**為true時,該目標就只能通過命令行直接調用。默認為false * can this Mojo be invoked directly only? * @return invoked directly only */
    boolean requiresDirectInvocation() default false; /**是否要求maven必須是在線狀態,默認值為false * does this Mojo need to be online to be executed? * @return need to be online */
    boolean requiresOnline() default false; boolean inheritByDefault() default true; /** * own configurator class. * @return own configurator class */ String configurator() default ""; /** * is your mojo thread safe (since Maven 3.x)? * @return is thread safe */
    boolean threadSafe() default false; }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM