Maven 自定义Maven插件
1.介绍
我们经常在写pom的时候,会在build的几点里面配有各式各样的plugin,这些plugin就是maven的插件,他们通常叫做Mojo,这些插件的作用就是在构建项目的过程中,执行一些动作,行为,例如使用maven-jar-plugin的插件,就是用于打包jar。又例如,我们在使用spring boot的时候,为什么执行mvn spring-boot:run的时候,maven会做一些spring-boot的构建方式,是因为我们在build里面配有了spring-boot-maven-plugin的插件,并且执行了run的类。下面我们就来自定义一个mojo。
2. 插件命名规则
在我们开始创建一个自定义插件之前,我们先来看看命名规则,其实起什么名字都可以,官方建议使用xxx-maven-plugin,请看下面例子
但是这里有一点,当们需要执行一个命令的时候,我们必须是这么写:组名:模块名:版本号:运行名称
这样写没问题,只是有点繁琐,但是如果我们的插件结尾为-maven-plugin那么我们就可以使用简化写法,并且达到相同效果: [模块名去掉-maven-plugin]:运行名称
3.开始写自定义组件
可以通过各类IDE,如果eclipse,或者idea都可以,创建一个maven的项目,在选择模块的时候,可以选择mojo的模块,IDE就会很快的帮你建立出mojo的开发环境,在开发的pom里面就是一个最简单的pom结构,但是如果要开发mojo,我们还需要引入两个插件,一个是maven-plugin-api,一个是maven-plugin-annotations,用上这两个插件,我们才能编写属于我们的自定义插件
<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/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <packaging>maven-plugin</packaging> <version>1.0-SNAPSHOT</version> <name>my-maven-plugin Maven Mojo</name> <url>http://maven.apache.org</url> <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.1</version> </dependency> </dependencies> </project>
下面是一个java执行类,就是我们要执行的一写操作,这里需要继承AbstractMojo类,和重写execute方法,里面就是具体我们要实行的的逻辑,这里关键点是注解,我们后面详细说明
package com.test.maven; import org.apache.maven.plugin.AbstractMojo; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Execute; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; /** * Goal which touches a timestamp file. * * @goal touch * * @phase process-sources */ @Mojo(name="hello",defaultPhase = LifecyclePhase.CLEAN) public class MyMojo extends AbstractMojo { @Parameter private String test; public void execute() throws MojoExecutionException { System.out.println(" ---------->> Hello My Plugins = " + test); } }
写完这两个东西之后,我们就可以把这个插件,安装到库里面,执行 mvn install。这样我们其他的项目就可以使用这个插件来对我们的项目进行一个些自定义的操作了
其他项目的pom,在其他项目引用这个插件就像平常一样,在build里面写上插件的信息
<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.test.maven.phase</groupId> <artifactId>my-maven-test-phase</artifactId> <version>0.0.1-SNAPSHOT</version> <build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> </plugin> </plugins> </build> </project>
然后运行,这里的hello对应的就是上面我们自定义组件中@Mojo里面的name属性: mvn my:hello
4. 自定义组件的属性说明
下面找几个例子来说明,分两个文件,一个是组件里面的注解,一个是项目里面pom的配置写法
例子1:
//组件组件
@Mojo(name="hello")
<!-- 项目配置 如果这里不配置执行目标,或者执行所在的生命周期,执行后是不会产生效果的 -->
<build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <!-- 执行目标 --> <goal>hello</goal> </goals> <!-- 执行这个目标所在的生命周期 --> <phase>clean</phase> </execution> </executions> <configuration> <test>peter</test> </configuration> </plugin> </plugins> </build>
例子2:
//自定义组件,名称为hello, 默认执行周期 clean,
@Mojo(name="hello",defaultPhase = LifecyclePhase.CLEAN)
<!-- 这里就不需要想例子一当中 在pom里面指定生命周期的执行阶段了 -->
<build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <!-- 执行目标 --> <goal>hello</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
例子3:
//声明参数,用于pom注入参数 @Parameter private String test;
<build> <plugins> <plugin> <groupId>com.test.maven</groupId> <artifactId>my-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <!-- 执行目标 --> <goal>hello</goal> </goals> </execution> </executions>
<!-- 这里对应的test节点,就是对应的自定义组件中,参数名 里面的值就是要注入的值,使用场景是,当需要注入目标项目的相对路径或者项目名称等等一些信息 -->
<configuration> <test>peter</test> </configuration> </plugin> </plugins> </build>