Mojo:Maven plain Old Java Object。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。
一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。Maven插件项目的打包方式packaging必须为maven-plugin
<!--打包方式-->
<packaging>maven-plugin</packaging>
<dependencies>
<!--使用doc的方式-->
<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>
<scope>provided</scope>
</dependency>
<!-- maven 开发插件需要的依赖 end -->
<dependency>
<groupId>org.codehaus.plexus</groupId>
<artifactId>plexus-utils</artifactId>
<version>3.0.8</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.5.2</version>
<!-- 插件执行命令前缀 -->
<configuration>
<goalPrefix>mp</goalPrefix>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
<!--执行器-->
<executions>
<!--使用注解方式-->
<execution>
<!--任务Id-->
<id>generated-helpmojo</id>
<!--绑定到package生命周期阶段上 不是必须的 默认将该目标绑定至default声明周期的某个阶段,
这样在配置使用插件目标时,就无需声明phase,在代码里面也是可以指定的-->
<!--<phase>package</phase>-->
<goals>
<!-- goals里面配置的就是刚刚在@mojo里面的name -->
<goal>helpmojo</goal>
</goals>
</execution>
<!--使用文档方式-->
<execution>
<!-- 插件执行命令前缀 -->
<configuration>
<goalPrefix>api</goalPrefix>
<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
</configuration>
<id>hellMojo-Demo</id>
<goals>
<goal>hellMojoDemo</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- 自定义插件的使用示例 -->
<!--
maven 执行自定义插件goal命令调用的顺序有两种:
第一种:
groupId:artifactId:version:goal
当前示例:com.plugin.test:maven-plugin-test:1.0:sayhi
需要加插件(如果需要设置自定义插件依赖的参数,方可添加,否则的话,不需要添加)
1).maven-plugin-test(自定义开发插件、设置自定义插件依赖的参数)
第二种:
goalPrefix:goal
当前示例:statis:sayhi
需要加插件
1).maven-plugin-plugin(可以定义前缀、和goal执行时所需参数)
2).maven-plugin-test(自定义开发插件、设置自定义插件依赖的参数)
在例子里已经有,自行查看
-->
<!--<build>-->
<!--<pluginManagement>-->
<!--<plugins>-->
<!--<plugin>-->
<!--<groupId>org.apache.maven.plugins</groupId>-->
<!--<artifactId>maven-plugin-plugin</artifactId>-->
<!--<version>3.2</version>-->
<!--<executions>-->
<!--<execution>-->
<!--<id>default-descriptor</id>-->
<!--<goals>-->
<!--<goal>descriptor</goal>-->
<!--</goals>-->
<!--<phase>process-classes</phase>-->
<!--</execution>-->
<!--<execution>-->
<!--<id>help-descriptor</id>-->
<!--<goals>-->
<!--<goal>helpmojo</goal>-->
<!--</goals>-->
<!--<phase>process-classes</phase>-->
<!--</execution>-->
<!--</executions>-->
<!--<configuration>-->
<!--<skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>-->
<!--<goalPrefix>statis</goalPrefix><!– 插件执行命令前缀 –>-->
<!--</configuration>-->
<!--</plugin>-->
<!--<plugin>-->
<!--<groupId>com.plugin.test</groupId>-->
<!--<artifactId>maven-plugin-test</artifactId>-->
<!--<version>1.0</version>-->
<!--<configuration>-->
<!--<age>28</age><!– goal执行所需参数指定位置,必须与goal目标的属性一致 –>-->
<!--</configuration>-->
<!--</plugin>-->
<!--</plugins>-->
<!--</pluginManagement>-->
<!--</build>-->
/**
* 使用文档的方式
* @goal hellMojoDemo
*/
public class PrintMojoDemo01 extends AbstractMojo {
/**
* path of the classes folder.
* @parameter expression="${classFolderPath}"
*/
private String classFolderPath;
/**
* @parameter expression = "${application}"
*/
private String application;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.println(classFolderPath);
System.out.println(application);
System.out.println("自定义maven文档形式");
}
}
/**
* Mojo标注:
* /**
* *@goal CustomMavenMojo:表示该插件的服务目标
* *@phase compile:表示该插件的生效周期阶段
* *@requiresProject true:表示是否依托于一个项目才能运行该插件
* *@parameter expression="${name}":表示插件参数,使用插件的时候会用得到
相关依赖:
<!--使用doc的方式-->
<dependency>
<groupId>org.apache.maven</groupId>
<artifactId>maven-plugin-api</artifactId>
<version>3.5.2</version>
</dependency>
* */
PrintMojo继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。
那么Maven 如何知道这是一个 Mojo 而不是一个普通的 Java 类呢? Mojo 的查找机制:在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注释的类来当作一个 Mojo 类。在上面的例子中,我们使用了 Javadoc 的方法来声明一个 Mojo。同样我们也可以使用 @Mojo 注解来进行声明。
/**
*
* @author yehui
*
* 该类就是maven自定义插件类
*
*/
// mojo注解就是maven插件的注解,具体什么我忘记了。name就是后面使用该插件的时候excuation里面的,
// 后面配置的是生命周期,我这里配置了install,即默认是安装时候执行本插件(这个可以在pom文件指定)
@Mojo(name = "helpmojo",defaultPhase = LifecyclePhase.INSTALL)
public class PrintMojo extends AbstractMojo {
// // 配置的是本maven插件的配置,在pom使用configration标签进行配置 property就是名字,
// 在配置里面的标签名字。在调用该插件的时候会看到
@Parameter(property = "application")
private String application;
@Parameter(property = "sourceFolderPath")
private String sourceFolderPath;
@Parameter(property = "driverName")
private String driverName;
@Parameter(property = "dbUrl")
private String dbUrl;
@Parameter(property = "dbName")
private String dbName;
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
System.out.print("Hello World");
System.out.println(application);
System.out.println(sourceFolderPath);
System.out.println(driverName);
System.out.println(dbUrl);
System.out.println(dbName);
}
}
mvn clean package
原文:https://www.cnblogs.com/cxyyh/p/10847620.html