Maven
插件,所以只是通过这个角度帮助自己更好的理解插件的目标和生命周期阶段之间的关系
创建一个Maven
工程即可:
groupId
:com.scorpios.maven
artifactId
:hello-maven-plugin
(名称有规则,看下文)
要在pom
文件中指定打包方式为:maven-plugin
maven-plugin
<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.0modelVersion>
<groupId>org.scorpio.mavengroupId>
<artifactId>hello-maven-pluginartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<maven.compiler.source>8maven.compiler.source>
<maven.compiler.target>8maven.compiler.target>
properties>
<packaging>maven-pluginpackaging>
project>
下面两种方式二选一,都可以实现定制目标方法
<dependency>
<groupId>org.apache.mavengroupId>
<artifactId>maven-plugin-apiartifactId>
<version>3.5.2version>
dependency>
<dependency>
<groupId>org.apache.maven.plugin-toolsgroupId>
<artifactId>maven-plugin-annotationsartifactId>
<version>3.5.2version>
dependency>
Mojo
类是一个 Maven
插件的核心类。Mojo
这个单词的意思是:Maven Old Java Object
。
每一个 Mojo
都需要实现 org.apache.maven.plugin.Mojo
接口
实现 Mojo
接口比较困难,可以继承 AbstractMojo
,此时只要实现execute()
这一个方法即可。
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> This is my first maven plugin. <---");
}
}
在上面引入依赖时有两种选择,所以这地方配置分别对应上述两种选择。
此种配置方式对应上述 pom.xml
中引入的依赖: maven-plugin-api
//指定调用本类execute()方法的目标
/**
* @goal sayHello
**/
public class MyHelloPlugin extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> This is my first maven plugin. <---");
}
}
此处能不能理解,在配置plugin时指定的goal标签的意思。在goal标签中指定sayHello,则就会执行此处的execute()方法
此种配置方式对应上述pom.xml
中引入的依赖: maven-plugin-annotations
// name 属性:指定目标名称
@Mojo(name = "firstBlood")
public class MyPluginOfFistBlood extends AbstractMojo {
@Override
public void execute() throws MojoExecutionException, MojoFailureException {
getLog().info("---> first blood <---");
}
}
此种方式和上面效果一样
若要把该插件提供给其他项目使用,就必须要将插件安装到本地仓库
需要将插件坐标中的 groupId
部分注册到 settings.xml
中
<pluginGroups>
<pluginGroup>com.scorpios.mavenpluginGroup>
pluginGroups>
Maven
根据插件的 artifactId
来识别插件前缀,例如下面两种情况:
匹配规则:${prefix}-maven-plugin
artifactId
:hello-maven-plugin
前缀:hello
匹配规则:maven-${prefix}-plugin
artifactId
:maven-good-plugin
前缀:good
命令:mvn hello:sayHello
意思:执行maven
的hello
插件,并执行里面的goal
为sayHello
指定的execute()
方法
这里找一个和插件无关的 Maven
工程配置才有说服力。
<build>
<plugins>
<plugin>
<groupId>com.scorpios.mavengroupId>
<artifactId>hello-maven-pluginartifactId>
<version>1.0-SNAPSHOTversion>
<executions>
<execution>
<id>helloid>
<phase>cleanphase>
<goals>
<goal>sayHellogoal>
goals>
execution>
<execution>
<id>bloodid>
<phase>validatephase>
<goals>
<goal>firstBloodgoal>
goals>
execution>
executions>
plugin>
plugins>
build>
执行已和插件目标绑定的生命周期: