Maven3.x 插件開發入門

  Maven工具備不少插件,各類各樣的插件,讓咱們開發調試過程當中很是方便,可是終究是有你想要的可是現目前插件不能知足的(可能性很是很是低),這個時候就須要使用其餘的替代工具,或者是本身來開發一個Maven插件。apache

  事實上,學Maven插件開發對於咱們這種小鳥意義並不大,有兩個緣由:一、咱們日常須要使用的,幾乎Maven都有提供;二、若是實在沒有,那通常來講都有相似的工具做爲替代,咱們能夠去使用另外的工具。可是,咱們對Maven使用,研究深刻了之後,學學他的插件開發來玩一下仍是不錯的。這對Maven的精髓思想的理解仍是有很大幫助的。api

  這裏的的插件開發工具是Eclipse-Mars版本。tomcat

  一、建立插件項目:(項目原型選擇插件類型)app

  

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

  

  三、建立完畢以後的結構是這樣:maven

  

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

<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>

  五、刪掉默認的包,本身新建一個包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...");
    }

}

  六、這樣插件就開發完成了。咱們將插件install到本地倉庫。而後在項目組引入,能夠是在本插件項目中引入,也能夠在其餘項目中引入。開發工具

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

  七、使用eclipse的Maven插件來運行,這裏的Maven插件實質Eclipse的Maven插件,而不是Maven本身的插件。以下:ui

  

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

  

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

    一、插件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>

 

    二、註解@Mojo是必需要的,這是定義插件對象的啓動方法,因爲該類只有一個方法,因此啓動方法和啓動類是一致的。在Maven 3以前是使用註釋註解:@goal xxx這種方式。如今已經不使用這種方式了。

    三、咱們平時在使用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,這就是插件的參數設置方式。

    

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

  

  其餘:新建的eclipse項目上面報錯,顯示execution not covered by lifecycle這種錯誤,搜了一下,在<build>下<pluginManagement>下<plugins>中加入:

<plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>org.apache.maven.plugins</groupId>
                                        <artifactId>maven-plugin-plugin</artifactId>
                                        <versionRange>[3.2,)</versionRange>
                                        <goals>
                                            <goal>descriptor</goal>
                                            <goal>helpmojo</goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>

其中:groupId,artifactId,versionRange,goals是須要本身去改變的,由於不有可能其餘的插件也會報這個錯誤,按照這幾個標籤內容改就好了,我這裏是maven-plugin-plugin這個插件在報錯。

相關文章
相關標籤/搜索