1.介紹
我們經常在寫pom的時候,會在build的幾點里面配有各式各樣的plugin,這些plugin就是maven的插件,他們通常叫做Mojo,這些插件的作用就是在構建項目的過程中,執行一些動作,行為,例如使用maven-jar-plugin的插件,就是用於打包jar。又例如,我們在使用spring boot的時候,為什么執行mvn spring-boot:run的時候,maven會做一些spring-boot的構建方式,是因為我們在build里面配有了spring-boot-maven-plugin的插件,並且執行了run的類。下面我們就來自定義一個mojo。
2. 插件命名規則
在我們開始創建一個自定義插件之前,我們先來看看命名規則,其實起什么名字都可以,官方建議使用xxx-maven-plugin,請看下面例子
但是這里有一點,當們需要執行一個命令的時候,我們必須是這么寫:組名:模塊名:版本號:運行名稱
這樣寫沒問題,只是有點繁瑣,但是如果我們的插件結尾為-maven-plugin那么我們就可以使用簡化寫法,並且達到相同效果: [模塊名去掉-maven-plugin]:運行名稱
3.開始寫自定義組件
可以通過各類IDE,如果eclipse,或者idea都可以,創建一個maven的項目,在選擇模塊的時候,可以選擇mojo的模塊,IDE就會很快的幫你建立出mojo的開發環境,在開發的pom里面就是一個最簡單的pom結構,但是如果要開發mojo,我們還需要引入兩個插件,一個是maven-plugin-api,一個是maven-plugin-annotations,用上這兩個插件,我們才能編寫屬於我們的自定義插件
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <packaging>maven-plugin</packaging> <version>1.0-SNAPSHOT</version> <name>my-maven-plugin Maven Mojo</name> <url>http://maven.apache.org</url> <dependencies> <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.1</version> </dependency> </dependencies> </project>
下面是一個java執行類,就是我們要執行的一寫操作,這里需要繼承AbstractMojo類,和重寫execute方法,里面就是具體我們要實行的的邏輯,這里關鍵點是注解,我們后面詳細說明
package com.test.maven; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Execute; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; /** * Goal which touches a timestamp file. * * @goal touch * * @phase process-sources */ @Mojo(name="hello",defaultPhase = LifecyclePhase.CLEAN) public class MyMojo extends AbstractMojo { @Parameter private String test; public void execute() throws MojoExecutionException { System.out.println(" ---------->> Hello My Plugins = " + test); } }
寫完這兩個東西之后,我們就可以把這個插件,安裝到庫里面,執行 mvn install。這樣我們其他的項目就可以使用這個插件來對我們的項目進行一個些自定義的操作了
其他項目的pom,在其他項目引用這個插件就像平常一樣,在build里面寫上插件的信息
<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.test.maven.phase</groupId> <artifactId>my-maven-test-phase</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> </plugins> </build> </project>
然后運行,這里的hello對應的就是上面我們自定義組件中@Mojo里面的name屬性: mvn my:hello
4. 自定義組件的屬性說明
下面找幾個例子來說明,分兩個文件,一個是組件里面的注解,一個是項目里面pom的配置寫法
例子1:
//組件組件
@Mojo(name="hello")
<!-- 項目配置 如果這里不配置執行目標,或者執行所在的生命周期,執行后是不會產生效果的 -->
<build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <!-- 執行目標 --> <goal>hello</goal> </goals> <!-- 執行這個目標所在的生命周期 --> <phase>clean</phase> </execution> </executions> <configuration> <test>peter</test> </configuration> </plugin> </plugins> </build>
例子2:
//自定義組件,名稱為hello, 默認執行周期 clean,
@Mojo(name="hello",defaultPhase = LifecyclePhase.CLEAN)
<!-- 這里就不需要想例子一當中 在pom里面指定生命周期的執行階段了 -->
<build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <!-- 執行目標 --> <goal>hello</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
例子3:
//聲明參數,用於pom注入參數 @Parameter private String test;
<build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <!-- 執行目標 --> <goal>hello</goal> </goals> </execution> </executions>
<!-- 這里對應的test節點,就是對應的自定義組件中,參數名 里面的值就是要注入的值,使用場景是,當需要注入目標項目的相對路徑或者項目名稱等等一些信息 -->
<configuration> <test>peter</test> </configuration> </plugin> </plugins> </build>