Maven 自定義插件

1. provide

插件提供者 項目結構

├── pom.xml
├── src
│   └── main
│       ├── java
│       │   └── com
│       │       └── fantj
│       │           └── mypluginprovide
│       │               └── MyMojo.java
│       └── resources
│           └── application.properties
└── target
    │  
    └── my-plugin-provide-0.0.1-SNAPSHOT.jar

1.1 修改packaging
 <packaging>maven-plugin</packaging>
1.2. 修改pom
<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-plugin-api</artifactId>
    <version>3.5.0</version>
</dependency>
<dependency>
    <groupId>org.apache.maven.plugin-tools</groupId>
    <artifactId>maven-plugin-annotations</artifactId>
    <version>3.5</version>
</dependency>

這兩個依賴是自定義插件必須的依賴,代表了它是一個Mojo工程,裏面包含了一些Mojo的接口和抽象類以及註解。

1.3 coding業務邏輯
@Mojo(name = "fantj",defaultPhase = LifecyclePhase.PACKAGE)
public class MyMojo extends AbstractMojo {

    @Parameter
    private String msg;

    @Parameter
    private List<String> list;

    public void execute() throws MojoExecutionException, MojoFailureException {
        System.out.println("hello plugin: "+msg + "list: "+ list);
    }
}

注意這裏面的@Parameter``@Mojo`` LifecyclePhase.PACKAGE都是org.apache.maven.plugins.annotations包下的:

import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;

@Parameter註解會獲取消費者配置文件中的變量值並賦值。

defaultPhase = LifecyclePhase.PACKAGE聲明瞭該插件觸發的生命週期。

@Mojo定義插件的goal名字。

1.3. clean and install

執行mvn clean install,在target目錄下會生成這樣一個jar包,這就是插件包。

2. consume

插件消費者 : 項目結構

├── pom.xml
└── src
    └── main
        ├── java
        │   └── com
        │       └── fantj
        │           └── mypluginuse
        └── resources
            └── application.properties
2.1 修改pom
<?xml version="1.0" encoding="UTF-8"?>
<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.fantj</groupId>
    <artifactId>my-plugin-consume</artifactId>
    <version>0.0.1-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>com.fantj</groupId>
                <artifactId>my-plugin-provide</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <configuration>
                    <msg>hello plugin</msg>
                    <list>
                        <list>one</list>
                        <list>two</list>
                    </list>
                </configuration>

                <!--在執行package時候自動執行自定義插件 將插件掛到 phase 中 -->
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>fantj</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

如果不加<executions>,我們只能通過執行插件或者執行命令的方式來執行,如果想讓它在執行package的時候自動執行,就需要設置該屬性,可以把它理解成hook。

2.2 如何傳遞參數給plugin

在插件提供者中,有個MyMojo的類,有這樣一段代碼:

    @Parameter
    private String msg;

    @Parameter
    private List<String> list;

它和你用過的spring註解一樣,也是用來以註解的形式獲取參數的值。

相對應的,在插件消費者的配置中我們就應該相應的給出參數的定義:

<configuration>
    <msg>hello plugin</msg>
    <list>
         <list>one</list>
         <list>two</list>
    </list>
</configuration>

上面的配置與變量名一一對應即可。這時候你會發現maven插件中自動會添加一個plugins選項:

執行該插件:mvn myprovide:fantj 或者直接點擊

[fantj@lalala my-plugin-consume]$ mvn myprovide:fantj
[INFO] Scanning for projects...
[INFO] 
[INFO] --------------------< com.fantj:my-plugin-consume >---------------------
[INFO] Building my-plugin-consume 0.0.1-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO] 
[INFO] --- my-plugin-provide:0.0.1-SNAPSHOT:fantj (default-cli) @ my-plugin-consume ---
hello plugin: hello pluginlist: [one, two]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.347 s
[INFO] Finished at: 2018-11-01T19:59:04+08:00
[INFO] ------------------------------------------------------------------------
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章