第一、自定义Maven插件概述

Mojo:Maven plain Old Java Object。每一个 Mojo 就是 Maven 中的一个执行目标(executable goal),而插件则是对单个或多个相关的 Mojo 做统一分发。

一个 Mojo 包含一个简单的 Java 类。插件中多个类似 Mojo 的通用之处可以使用抽象父类来封装。Maven插件项目的打包方式packaging必须为maven-plugin

第二、自定义插件Maven插件的实现

1、创建一个maven项目mavenplugin

2、引入maven依赖

maven-plugin

org.apache.maven

maven-plugin-api

3.5.2

org.apache.maven.plugin-tools

maven-plugin-annotations

3.5.2

provided

org.apache.maven.plugins

maven-plugin-plugin

3.5.2

mp

true

3、自定义maven插件文档方式实现

/*** 使用文档的方式
* @goal hellMojoDemo*/
public class PrintMojoDemo01 extendsAbstractMojo {/*** path of the classes folder.
* @parameter expression="${classFolderPath}"*/
privateString classFolderPath;/*** @parameter expression = "${application}"*/
privateString application;
@Overridepublic void execute() throwsMojoExecutionException, MojoFailureException {
System.out.println(classFolderPath);
System.out.println(application);
System.out.println("自定义maven文档形式");
}
}/*** Mojo标注:
* /**
* *@goal CustomMavenMojo:表示该插件的服务目标
* *@phase compile:表示该插件的生效周期阶段
* *@requiresProject true:表示是否依托于一个项目才能运行该插件
* *@parameter expression="${name}":表示插件参数,使用插件的时候会用得到

相关依赖:

org.apache.maven

maven-plugin-api

3.5.2

**/

4、自定义maven插件注解方式实现

PrintMojo继承了 AbstractMojo 这个抽象类,并实现了 execute() 方法,该方法就是用来定义这个 Mojo 具体操作内容,我们只需要根据自己的需要来编写自己的实现即可。

那么Maven 如何知道这是一个 Mojo 而不是一个普通的 Java 类呢? Mojo 的查找机制:在处理源码的时候,plugin-tools 会把使用了 @Mojo 注解或 Javadoc 里包含 @goal 注释的类来当作一个 Mojo 类。在上面的例子中,我们使用了 Javadoc 的方法来声明一个 Mojo。同样我们也可以使用 @Mojo 注解来进行声明。

/***

*@authoryehui

*

* 该类就是maven自定义插件类

**/

//mojo注解就是maven插件的注解,具体什么我忘记了。name就是后面使用该插件的时候excuation里面的,//后面配置的是生命周期,我这里配置了install,即默认是安装时候执行本插件(这个可以在pom文件指定)

@Mojo(name = "helpmojo",defaultPhase =LifecyclePhase.INSTALL)public class PrintMojo extendsAbstractMojo {// //配置的是本maven插件的配置,在pom使用configration标签进行配置 property就是名字,//在配置里面的标签名字。在调用该插件的时候会看到

@Parameter(property = "application")privateString application;
@Parameter(property= "sourceFolderPath")privateString sourceFolderPath;
@Parameter(property= "driverName")privateString driverName;
@Parameter(property= "dbUrl")privateString dbUrl;
@Parameter(property= "dbName")privateString dbName;
@Overridepublic void execute() throwsMojoExecutionException, 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);
}
}

5、打包、安装到本地仓库

打包:mvn clean package

安装到本地仓库:mvn clean install

6、创建一个测试项目(maventest)

引入刚刚自定义的插件

com.yehui
mavenplugin
1.0-SNAPSHOT
api
${basedir}
com.mysql.jdbc.Driver
jdbc:mysql://10.16.88.189:3306
iapps
yehui

效果:

javadoc 插件 java怎么写插件_java自定义maven插件

双击运行:

javadoc 插件 java怎么写插件_maven_02

源码地址:

https://github.com/yhcxy/sourceCode/tree/master/mavenplugin

第三、mojo参数详解

每个mojo都必须使用@Goal标注来表明其目标名称,否则maven将无法识别该目标。还有其他很多标注,列举如下:

@goal :唯一必须声明的标注,当用户命令行调用或在pom中配置插件是,需使用该目标名称,如果你在运行compiler:compile目标,compiler就是插件的goalPrefix,compile就是目标的名称

@phase :默认将该目标绑定至default声明周期的某个阶段,这样在配置使用插件目标时,就无需声明phase,如maven-surefire-plugin的test目标带有@phase tes标注

@requiresDependencyResolution :在运行mojo之前必须解析所有指定范围的依赖,如maven-surefire-plugin的test目标带有requiresDependencyResolution test标注,表示执行测试前,所有测试范围的依赖必须得到解析

@requiresProject :该目标是否必须在一个maven项目中运行(如测试插件用于测试其他项目),默认为true。大部分插件目标需依赖一个项目才能运行,但是,maven-help-plugin的system目标例外,它用来显示系统属性和环境变量信息,无需实际项目。

@requiresOnline :是否要求maven必须是在线状态,默认值为false

@requiresReport :是否要求项目报告已经生成,默认为false

@aggregator:当mojo在多模块项目上运行时,该标注表示目标只会在顶层模块运行。

@requiresDirectInvocation :为true时,该目标就只能通过命令行直接调用。默认为false

@execute goal="":在运行该目标之前,让maven运行另外一个目标。如果是本插件目标,则直接调用目标名称,否则,使用“prefix:goal”

@execute phase="":在运行该目标前,让maven先运行一个并行的生命周期,到指定的阶段为止。到phase执行完,才执行插件目标

@execute lifecycle="" phase = "":在运行该目标前,让maven先运行一个自定义的生命周期,到指定的阶段为止。

parameters:该元素描述Mojo的所有参数。name,type,required,editable(是否允许在pom.xml中设置),description,如可使用@parameter将mojo的某个字段标注为可配置参数,即mojo参数。支持boolean,int,float,String,Date,File,Url,数组,Collection,map,Propertes

configuration:为所有Mojo参数提供默认值)

第四、maven内置属性

1、maven属性

内置属性(maven预定义,用户可以直接使用的)

主要有两个常用内置属性——

${basedir}表示项目根目录,即包含pom.xml文件的目录;

${version}表示项目版本。

${project.basedir}同${basedir};

2、POM属性(使用pom属性可以引用到pom.xml文件对应的元素的值)

${project.build.sourceDirectory}:项目的主源码目录,默认为src/main/java/.

${project.build.testSourceDirectory}:项目的测试源码目录,默认为/src/test/java/.

${project.build.directory}:项目构建输出目录,默认为target/.

${project.outputDirectory}:项目主代码编译输出目录,默认为target/classes/.

${project.testOutputDirectory}:项目测试代码编译输出目录,默认为target/testclasses/.

${project.groupId}:项目的groupId.

${project.artifactId}:项目的artifactId.

${project.version}:项目的version,于${version}等价

${project.build.finalName}:项目打包输出文件的名称,默认 为${project.artifactId}${project.version}

自定义属性(在pom.xml文件的标签下定义的maven属性)

proname

在其他地方就可以使用该自定义的属性了:

org.springframework

spring-jdbc

${my.pro}

setting.xml文件属性(与pom属性同理,用户可以用以settings.开头的属性引用setting.xml文件的XML元素值)

${settings.localRepository}表示本地仓库的地址

java系统属性(所有的java系统属性都可以用env,开头的maven属性引用)

使用mvn help:system命令可查看所有环境变量;

${env.JAVA_HOME}表示JAVA_HOME环境变量的值;