一、如何手写一个maven plugin
maven plugin的作用就是在maven生命周期的某一个阶段去完成一个事情。
1.maven生命周期(lifecycle)中的每个阶段(phase)都可以绑定n(>=1)个插件(plugin)的目标(goal)
2.多个goal绑定同一个phase的话,maven会从上到下依次执行
3.一个plugin中可以包含多个goal
4.maven插件的命名规则:maven-xxx-plugin xxx-maven-plugin(spring喜欢这种风格)
5.如何在idea中调试maven插件:如何调试maven插件
1.1 maven插件的前置准备工作
第一步:maven插件pom文件需要修改打包方式
<packaging>maven-plugin</packaging>
第二步:引入依赖
<dependencies> <!-- 写注解插件必引入 --> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-plugin-api</artifactId> <version>3.5.2</version> </dependency> <!-- 注解方式定义插件时才用得到 --> <dependency> <groupId>org.apache.maven.plugin-tools</groupId> <artifactId>maven-plugin-annotations</artifactId> <version>3.5.2</version> </dependency> <!-- 生成插件描述信息 plugin.xml--> <dependency> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.5</version> </dependency> <!-- 获取maven工程的pom配置信息--> <dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-project</artifactId> <version>2.2.1</version> </dependency> </dependencies>
第三步:在build文件中引用插件描述信息依赖
<build> <plugins> <!-- 生成插件描述信息 plugin.xml--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-plugin-plugin</artifactId> <version>3.5</version> </plugin> </plugins> </build>
1.2 实现方式
1.2.1 注释方式实现(不推荐,已经废弃)
在注解里面写@goal 就会被识别到
/** * @goal comment * @version 1.0.0 * @since 1.0.0 * 注意:注释的方式不能与注解方式混用 */ public class CommentMoJo extends AbstractMojo { @Override public void execute() throws MojoExecutionException, MojoFailureException { Log log = getLog(); log.info("执行了goal:comment的execute方法"); } }
1.2.2 注解方式实现
@Mojo注解的name就是goal的名字,defaultPhase设置默认绑定的phase,不写默认是package
@Mojo(name = "annotation", defaultPhase = LifecyclePhase.PACKAGE) public class AnnotationMoJo extends AbstractMojo { @Parameter(defaultValue = "${project}") private MavenProject project; @Parameter(required = true) private String name; @Parameter(required = false) private String age; @Override public void execute() throws MojoExecutionException, MojoFailureException { Log log = getLog(); log.info("执行了goal:annotation的execute方法"); // 获取到最终jar包的名字 String packaging = project.getPackaging(); String finalName = project.getBuild().getFinalName(); log.info("获取到最终jar包的名字:"+finalName+"."+packaging); log.info("name的值:"+name); log.info("age的值:"+age); } }
获取<plugin>的<configuration>里面的参数配置
// 获取maven pom文件上下文 @Parameter(defaultValue = "${project}") private MavenProject project; // required = true代表这个参数是必须的 @Parameter(required = true) private String name; @Parameter(required = false) private String age;
插件打包
1.3 在项目中使用maven plugin
<build>
<plugins>
<plugin>
<groupId>com.example</groupId>
<artifactId>mavenplugin</artifactId>
<version>0.0.2-SNAPSHOT</version>
<configuration>
<!-- 可以被maven插件代码里面的@Parameter获取到-->
<name>cgy</name>
</configuration>
<executions>
<execution>
<id>comment</id>
<phase>package</phase>
<goals>
<goal>comment</goal>
</goals>
</execution>
<execution>
<id>anno</id>
<!-- 绑定的phase,没指定可以alt+友键查看<goal>annotation</goal>写的默认的阶段-->
<phase>package</phase>
<!-- goal是就是这个插件的执行name-->
<goals>
<goal>annotation</goal>
</goals>
</execution>
</executions>
<!-- 当插件的依赖不能传递时需要使用方显式引入-->
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.13.0</version>
<!-- <scope>provided</scope>-->
<!-- <optional>true</optional>-->
</dependency>
</dependencies>
</plugin>
<!-- 这个插件是spring的打包插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.6.11</version>
<executions>
<execution>
<id>repackage</id>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
1.4 查看maven生成的plugin.xml
这里有一个spring的打包插件
<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.6.11</version> <executions> <execution> <id>repackage</id> <phase>package</phase> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin>
alt+点击`<goal>repackage</goal>`可以查看这个goal生成的plugin.xml文件
1.5 plugin的依赖
当插件的依赖不能传递时需要使用方显式的引入依赖。
<dependency> <groupdId>commons-io</groupdId> <artifactId>commons-io</artifactId> <version>2.13.0</version> <!-- 当插件的依赖不能传递时需要使用方显式的引入依赖--> <scope>provided</scope> <!-- optional元素默认值(false) 不依赖传递--> <optional>true</optional> </dependency>
二、idea里面的maven插件含义
idea的maven插件
三、 常用的插件
一般我们写java项目只需要用一个打包插件即可,我们通常使用`spring-boot-maven-plugin`和`maven assembly plugin`这两个插件
[spring-boot-maven-plugin介绍](https://zhuanlan.zhihu.com/p/634098705)
[maven-assembly-plugin插件的使用方法](https://cloud.tencent.com/developer/article/1354070)
[maven-assembly-plugin插件的官方使用方法](https://maven.apache.org/plugins/maven-assembly-plugin/usage.html)
[maven-assembly-plugin插件的assembly文件官方介绍](https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html)
[自己写一个maven插件](https://www.bilibili.com/video/BV1au4y1e7rE?p=1&vd_source=e11238cac9f3e1ba071805e0deee4e23)
其他资料: