1. provide
插件提供者 項(xiàng)目結(jié)構(gòu)
├── 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>
這兩個(gè)依賴是自定義插件必須的依賴卑硫,代表了它是一個(gè)Mojo工程蒙袍,里面包含了一些Mojo的接口和抽象類以及注解予弧。
1.3 coding業(yè)務(wù)邏輯
@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
注解會(huì)獲取消費(fèi)者配置文件中的變量值并賦值媳瞪。
defaultPhase = LifecyclePhase.PACKAGE
聲明了該插件觸發(fā)的生命周期幽污。
@Mojo
定義插件的goal
名字。
1.3. clean and install
執(zhí)行mvn clean install
,在target目錄下會(huì)生成這樣一個(gè)jar包,這就是插件包。
2. consume
插件消費(fèi)者 : 項(xiàng)目結(jié)構(gòu)
├── 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>
<!--在執(zhí)行package時(shí)候自動(dòng)執(zhí)行自定義插件 將插件掛到 phase 中 -->
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>fantj</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
如果不加<executions>
,我們只能通過執(zhí)行插件或者執(zhí)行命令的方式來執(zhí)行担平,如果想讓它在執(zhí)行package
的時(shí)候自動(dòng)執(zhí)行,就需要設(shè)置該屬性,可以把它理解成hook锭部。
2.2 如何傳遞參數(shù)給plugin
在插件提供者中暂论,有個(gè)MyMojo
的類,有這樣一段代碼:
@Parameter
private String msg;
@Parameter
private List<String> list;
它和你用過的spring注解一樣空免,也是用來以注解的形式獲取參數(shù)的值。
相對(duì)應(yīng)的盆耽,在插件消費(fèi)者的配置中我們就應(yīng)該相應(yīng)的給出參數(shù)的定義:
<configuration>
<msg>hello plugin</msg>
<list>
<list>one</list>
<list>two</list>
</list>
</configuration>
上面的配置與變量名一一對(duì)應(yīng)即可蹋砚。這時(shí)候你會(huì)發(fā)現(xiàn)maven插件中自動(dòng)會(huì)添加一個(gè)plugins
選項(xiàng):
執(zhí)行該插件:mvn myprovide:fantj
或者直接點(diǎn)擊
[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] ------------------------------------------------------------------------