Maven工具有很多插件,各種各樣的插件,讓我們開發調試過程中非常方便,但是終究是有你想要的但是現目前插件不能滿足的(可能性非常非常低),這個時候就需要使用其他的替代工具,或者是自己來開發一個Maven插件。
事實上,學Maven插件開發對於我們這種小鳥意義並不大,有兩個原因:1、我們平常需要使用的,幾乎Maven都有提供;2、如果實在沒有,那一般來說都有類似的工具作為替代,我們可以去使用另外的工具。但是,我們對Maven使用,研究深入了以后,學學他的插件開發來玩一下還是不錯的。這對Maven的精髓思想的理解還是有很大幫助的。
這里的的插件開發工具是Eclipse-Mars版本。
1、創建插件項目:(項目原型選擇插件類型)
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的生命周期,階段和目標這幾個概念。這是另外一個話題了。
其他:新建的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這個插件在報錯。