Maven插件開發引導--第一個maven插件項目

前言

    因爲最近覺得mybatis自動生成代碼的功能很有用且有趣,就打算研究一下maven插件。本文的主要目的是使用命令行和使用idea引導建立第一個簡單的”hello,world” maven插件,部分參考了官方的文檔。個人感覺官方文檔內容設計不是特別好,有興趣有能力的同學可以自己看。

重要官方提示:插件命名規範和Apache Maven商標

    你最好命名你的插件爲<yourplugin>-maven-plugin。
    強烈不建議你命名插件爲maven-<yourplugin>-plugin(maven放在開頭),因爲這個命名模式是爲Apache Maven團隊的groupId爲org.apache.maven.plugins的插件項目保留的。使用這個命名模式侵犯了Apache Maven的商標。

你的第一個插件

    在這個部分,我們將會創建一個簡單的插件,這個插件不需要任何參數而且運行時只在屏幕上顯示一條信息。這樣,我們能夠展示創建一個插件項目的基本要點、最簡單的Java mojo的內容定義,以及幾種運行mojo的方法。

命令行創建

    先展示整個項目的目錄結構。
maven插件開發-maven-plugin.png

你的第一個mojo

    簡單來說,一個java mojo就是一個簡單的能夠實現一個插件的目標的java類。儘管一個插件中,幾個相似的mojo也可能會有一個父類來實現共同的代碼,但是不需要像EJBs一樣需要很多的類。
    當遍歷源碼目錄獲取mojo類時,插件工具會尋找帶有Java 5 @Mojo 註解或者 "goal"javadoc註解的類。帶有這個註解的類都會被被包含在插件的配置文件中。

A Simple mojo

下面是一個簡單的沒有參數的mojo的例子。

package sample.plugin;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;

/**
 * Says "Hi" to the user.
 *
 */
@Mojo( name = "sayhi")
public class GreetingMojo extends AbstractMojo
{
    public void execute() throws MojoExecutionException
    {
        getLog().info( "Hello, world." );
    }
}
  • 除了excute方法,類org.apache.maven.plugin.AbstractMojo提供了實現一個mojo的所有基礎要素。
  • 需要註解@Mojo
  • excute方法可以拋出兩種異常:
    • org.apache.maven.plugin.MojoExecutionException:如果出現任何未知的錯誤,拋出這個異常將會顯示一個“BUILD ERROR”信息。
    • org.apache.maven.plugin.MojoFailureException:如果產生髮生了已知的問題,拋出這個異常將會顯示一個“BUILD FAILURE”信息。
  • getLog方法(在AbstractMojo中定義)返回一個類似log4j的logger對象,這個對象允許插件創建“debug”、”info“、“warn”、”error”標籤的日誌。這個logger對象可以作爲一個給用戶打印日誌的一個方式。

pom配置:

    mojo類完成了之後,爲了正確的完成構建,項目需要合理地設置一些配置。

groupId 插件的groupId,最好匹配這個MOJO包的通用的前綴
artifactId 插件名
version 插件版本
packaging 應該設置爲“maven-plugin”
dependencies 對於Maven Plugin Tools API,需要引入的依賴,這樣項目才能去解析"AbstractMojo" 和相關的其他類。

下面是對上面表格中描述的參數在一個簡單的mojo項目的pom中如何設置的舉例說明:

<project>
  <modelVersion>4.0.0</modelVersion>

  <groupId>sample.plugin</groupId>
  <artifactId>hello-maven-plugin</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>maven-plugin</packaging>

  <name>Sample Parameter-less Maven Plugin</name>

  <dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.0</version>
    </dependency>

    <!-- dependencies to annotations -->
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.4</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
</project>

構建一個插件

    定義在maven-plugin中,有幾個和標準構建流程相關的插件功能。

compile 編譯插件的java代碼
process-classes 獲取數據構建關鍵字
test 運行插件單元測試
package 構建插件jar包
install 在本地倉庫中部署插件jar包
deploy 在遠程倉庫部署插件jar包

在項目根目錄下執行 mvn install,就能編譯部署插件jar包到本地倉庫。

也可以使用模板構建一個maven插件項目,直接執行命令:

mvn archetype:generate -DgroupId=sample.plugin -DartifactId=hello-maven-plugin -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-plugin

一路回車確定,就會在當前目錄生成一個模板插件項目。

執行你的第一個Mojo

    執行你的新插件最直接的方式是在命令行中。首先在你的項目中的pom.xml中添加下面的語句,引入這個插件。

···
<build>
  <plugins>
    <plugin>
      <groupId>sample.plugin</groupId>
      <artifactId>hello-maven-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
    </plugin>
  </plugins>
</build>
···

然後需要在項目根目錄下以下面的完整格式:

mvn groupId:artifactId:version:goal

執行插件。例如上面的例子就是"mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi"。如果你是要測試這個插件是否成功,也可以直接在插件項目的根目錄執行"mvn sample.plugin:hello-maven-plugin:1.0-SNAPSHOT:sayhi",運行結果如下:
maven插件開發-run.png

還可以將插件和具體的構建生命週期綁定起來,需要在pom中修改build配置。

···
<build>
  <plugins>
    <plugin>
      <groupId>sample.plugin</groupId>
      <artifactId>hello-maven-plugin</artifactId>
      <version>1.0-SNAPSHOT</version>
      <executions>
        <execution>
          <phase>compile</phase>
          <goals>
            <goal>sayhi</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>
···

這樣配置的話,當項目在編譯的過程中你的插件也會被執行。具體信息可以參考後續的文章(如果有,我會在這裏補充出來O. O)。

idea創建

生成插件項目

    idea創建一個插件模板項目就比較簡單了,以下是貼圖流程。

  1. 首先創建一個maven mojo的插件項目
    maven插件開發-first.png
  2. 設置項目
    maven插件開發-second.png
  3. 一路點擊下一步,然後生成plugin項目
    maven插件開發-third.png

自動生成的代碼已經包括了Mojo類,可以修改excute方法的內容,輸出“hello world"。

引用插件

    在pom.xml中引入插件配置後,可以在idea的maven構建窗口看到:
maven插件開發-hello.png

雙擊運行可以看到日誌輸出:
maven插件開發-build.png

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