Maven3.x 插件開發入門

  1、創建插件項目:(項目原型選擇插件類型)

  11.png

  2、Artifact Id 以xxx-maven-plugin命名,如:gr-maven-plugin,下面Version的內容無所謂。

  

  3、創建完畢之後的結構是這樣:

  

  4、修改pom.xml文件,加上2個依賴:分別是maven-plugin-api和maven-plugin-annotations,前者是插件開發API,後者是插件中使用的註解定以的包,注意打包方式爲:<packaging>maven-plugin</packaging>。完整的pom.xml文件如下,一定要把自動生成那些沒用的東西刪掉,只留下下面的內容,否則運行插件的時候有可能報錯。


<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.mook.plugin</groupId>
    <artifactId>gr-maven-plugin</artifactId>
    <version>1.0-RELEASE</version>
    <packaging>maven-plugin</packaging>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <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.2</version>
            <scope>provided</scope>
        </dependency>
    </dependencies></project>


  5、刪掉默認的包,自己新建一個包com.mook.plugin.gr,在這個包下面創建一個類叫做Car,繼承AbstractMojo類。重寫裏面的execute方法。如下:


@Mojo(name = "drive")public class Car extends AbstractMojo {

    @Override    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("Car drive...");
    }

}


  6、這樣插件就開發完成了。我們將插件install到本地倉庫。然後在項目組引入,可以是在本插件項目中引入,也可以在其他項目中引入。


    <build>
        <plugins>
            <plugin>
                <groupId>com.mook.plugin</groupId>
                <artifactId>gr-maven-plugin</artifactId>
                <version>1.0-RELEASE</version>
            </plugin>
        </plugins>
    </build>


  7、使用eclipse的Maven插件來運行,這裏的Maven插件實質Eclipse的Maven插件,而不是Maven自己的插件。如下:

  

  8、輸出結果:Car drive...結果顯然是正確的。

  

  9、這裏來解釋下里面有幾個細節。

    1、插件artifactId爲什麼使用xxx-maven-plugin(或者xxx-plugin-maven),這個是約定的,如果這樣命名,在啓動插件的時候就可以像上面那樣gr:drive。否則就的把gr改成groupId:artifactId:version:xxx這種方式,很不方便,當然也有另外的方式處理,在settings文件裏面增加pluginManageMent內容,也能實現簡化寫法。(這個地方改一下,在我們的pom.xml文件中,plugins下面的maven-plugin-plugin中的<goalPrefix>標籤下是可以配置這個前綴名稱的,比如我這裏配置co,那麼啓動就是co:drive),如下:


            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-plugin-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <goalPrefix>co</goalPrefix>
                    <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
                </configuration>
                <executions>
                    <execution>
                        <id>mojo-descriptor</id>
                        <goals>
                            <goal>descriptor</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>help-goal</id>
                        <goals>
                            <goal>helpmojo</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>


 

    2、註解@Mojo是必須要的,這是定義插件對象的啓動方法,由於該類只有一個方法,所以啓動方法和啓動類是一致的。在Maven 3之前是使用註釋註解:@goal xxx這種方式。現在已經不使用這種方式了。

    3、我們平時在使用Maven的各種插件的時候往往都能在配置文件中傳入屬性的值,比如tomcat-maven-plugin插件我們可以隨意指定tomcat的端口號。這裏插件的處理方式是在Car類中定義一些屬性,比如下面這樣。然後我們重新將插件install到本地倉庫。再次運行。


@Mojo(name = "drive")public class Car extends AbstractMojo {
    
    @Parameter(defaultValue = "8080")    private Integer port;
    
    @Override    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("Car drive...");
        System.out.println(port);
    }

}


    輸出結果:

    

    那麼,在插件的配置中增加Configuration標籤,加上子標籤<port>,如下:


            <plugin>
                <groupId>com.mook.plugin</groupId>
                <artifactId>gr-maven-plugin</artifactId>
                <version>1.0-RELEASE</version>
                <configuration>
                    <port>8090</port>
                </configuration>
            </plugin>


    那麼,結果就是8090,這就是插件的參數設置方式。

    

  10、到這裏基本上就介紹完了。關於插件的運行,關係到Maven的生命週期,階段和目標這幾個概念。這是另外一個話題了。



在POM配置Maven plugin提示錯誤“Plugin execution not covered by lifecycle configuration”的解決方案

eclipse在其POM文件的一處提示出錯如下:

Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-plugin-plugin:3.2:descriptor (execution: default-descriptor, phase: generate-resources)pom.xml/gr-maven-pluginline 92Maven Project Build Lifecycle Mapping Problem

 

這表示m2e在其執行maven的生命週期管理時沒有定義該插件,所以提示出錯,其實m2e對此是提供了擴展機制的,我們可以通過如下操作來消除這個出錯提示:

1. 進入Window—>Preferences—>Maven配置,進入Lifecycle Mapping設置項,如下圖:

   

   從上圖可以看出m2e管理maven生命週期的文件名是lifecycle-mapping-metadata.xml,以及該文件的存放路徑

2. 下一步我們就要去相應路徑修改lifecycle-mapping-metadata.xml文件,但會發現這個文件在上圖中提示的位置並不存在,那麼此時就

以到eclipse的安裝目錄下的plugins下的org.eclipse.m2e.lifecyclemapping.defaults_xxxxxx.jar文件中找到該文件(如下圖):

 

通過解壓軟件可以發現lifecycle-mapping-metadata.xml文件的確在jar包中,把它從jar包中解壓出來並放置到前圖所示的路徑下

3. 打開lifecycle-mapping-metadata.xml文件,把未識別的插件在文件中加入即可:

<pluginExecution>
      <pluginExecutionFilter>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-plugin-plugin</artifactId>
        <goals>
          <goal>descriptor</goal>
        </goals>
        <versionRange>[3.2,)</versionRange>
      </pluginExecutionFilter>
      <action>
        <execute>
          <ignore />
        </execute>
      </action>
    </pluginExecution>

4.修改完成後,需在m2e配置處把“Update Maven projects on startup”選項勾上,並重啓eclipse即可消除出錯示。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章