maven系列目标:从入门开始开始掌握一个高级开发所需要的maven技能。
这是maven系列第10篇。
整个maven系列的内容前后是有依赖的,如果之前没有接触过maven,建议从第一篇看起,本文尾部有maven完整系列的连接。
Maven默认提供了很多插件,功能也非常强大,但是如果我们想自己开发一些插件,比如自定义一款自动打包并且发布到服务器然后重启服务器的插件;或者定义一款插件自动打包自动自动运行打包好的构件。各种好玩的东西只要你能想到,都可以通过maven插件去完成,不过我们需要先了解如何自定义maven插件。
jdk1.8
maven3.6.2
idea
自定义插件详细步骤
自定义插件参数的使用
自定义插件前缀的使用
手动实现打包之后自动运行的插件
maven中的插件是有很多目标(goal)组成的,开发插件,实际上就是去编写插件中目标的具体代码。每个目标对应一个java类,这个类在maven中叫做MOJO,maven提供了一个Mojo的接口,我们开发插件也就是去实现这个接口的方法,这个接口是:
org.apache.maven.plugin.Mojo
接口有3个方法:
void execute() MojoExecutionException, MojoFailureException;
void setLog( Log log );
Log getLog();
execute:这个方法比较重要,目标的主要代码就在这个方法中实现,当使用mvn命令调用插件的目标的时候,最后具体调用的就是这个方法。
setLog:注入一个标准的Maven日志记录器,允许这个Mojo向用户传递事件和反馈
getLog:获取注入的日志记录器
说一下上面这个Log,这是一日志接口,里面定义了很多方法,主要用户向交互者输出日志,比如我们运行mvn clean
,会输出很多提示信息,这些输出的信息就是通过Log来输出的。
Mojo接口有个默认的抽象类:
org.apache.maven.plugin.AbstractMojo
这个类中把Mojo
接口中的setLog
和getLog
实现了,而execute
方法没有实现,交给继承者去实现,这个类中Log默认可以向控制台输出日志信息,maven中自带的插件都继承这个类,一般情况下我们开发插件目标可以直接继承这个类,然后实现execute
方法就可以了。
packaging
比较特殊,必须为maven-plugin
,表示这个构件是一个插件类型,如下:pom.xml中的packageing元素必须如下值:
maven-plugin
org.apache.maven
maven-plugin-api
3.0
org.apache.maven.plugin-tools
maven-plugin-annotations
3.4
provided
org.apache.maven.plugin.AbstractMojo
@org.apache.maven.plugins.annotations.Mojo(name="目标名称")
注意@Mojo
注解用来标注这个类是一个目标类,maven对插件进行构建的时候会根据这个注解来找到这个插件的目标,这个注解中还有其他参数,后面在详细介绍。
execute
方法中实现具体的逻辑mvn clean install
或者可以部署到私服仓库,部署方式和其他构件的方式一样,这个具体去看前面文章的私服的文章。
下面我们来实现我们第一个插件,插件构件信息:
com.javacode2018
demo1-maven-plugin
1.0-SNAPSHOT
maven-plugin
创建一个目标类demo1,调用这个目标的时候,希望他能够输出:
hello my first maven plugin!
打开idea,点击File->New->Project
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j7QGWVgu-1629908740221)(media/40b81c016bc4695b99669f13d4af01fc.png)]
选择Maven
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kpWEPsmt-1629908740225)(media/29baa68faa1523b9e69503e0d4215eaa.png)]
点击上图中的Next
,如下图,输入项目坐标信息:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vfb9FhRG-1629908740229)(media/225faaebb3a428977aa17855f14fe700.png)]
点击上图中的Next
,如下图,输入Project name
为maven-chat10
:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rwq9IZ8l-1629908740233)(media/6c8782fcc498d677fc7b9abfd95f95b6.png)]
点击上图中的Finish
,完成创建,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nWmbgDMQ-1629908740236)(media/ad5ab3b6a563560a390f7d13a0c5701d.png)]
配置一下idea的maven环境,点击File->Settings
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JycBnj6d-1629908740240)(media/31e6ec12f10e0a9ca95e121685f815ae.png)]
删除下面2个无用的文件夹:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RALiKTwP-1629908740245)(media/68c1daa77d794421891803b7f6d1fc30.png)]
demo1-maven-plugin
这次用idea创建一个插件模块demo1-maven-plugin
,具体过程如下。
在刚才的maven-chat10
项目窗口中,点击File->Project Structure
,如下图:
也可以使用快捷键
Ctrl+Alt+Shift+S
打开
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LPebFzeb-1629908740249)(media/b7e6a8a3a532b21d3b1cb6856b94edd3.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fcB9ZJuO-1629908740253)(media/e43fc5acb27a2e9bb8cd266ea932f278.png)]
选择上图找你的Modules
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ECEuxh1M-1629908740255)(media/3ce9a3acab62ae38614b19baeadadec5.png)]
点击+
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eXVb49zy-1629908740257)(media/a0c7b7e5e99236811db416695282bb32.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63PKsU2y-1629908740259)(media/2f70ab7d2efa05b81336a598b8ae4b51.png)]
选择上图中的New Module
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-quJJ27Gh-1629908740261)(media/c8b78f9c86e120b9721e2dcba3fa7606.png)]
选择上图左侧的Maven
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zeWuodqE-1629908740262)(media/b2e32be73edd42d4f5dee01a33106027.png)]
点击上图中的Next
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Risad6pj-1629908740264)(media/41d93688bbdd89f5442c1a371f7e576a.png)]
将Add as module to
设置为maven-chat10
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yuth0uAC-1629908740266)(media/fc26e489460f14ff620e5e870a3073e8.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kprvWmuW-1629908740267)(media/9dbcf35404f710a23c7cc117ff28f504.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EiLpxwOm-1629908740269)(media/2311f90a15ae166c019a05fb72ed84f6.png)]
上图中输入坐标信息,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RrSaXjh1-1629908740270)(media/879707742287a5d4dfa8c72d25356073.png)]
点击上图中的Next
,默认如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jgg6t8bL-1629908740272)(media/eb247b603eee61f8595d53770405c01f.png)]
修改上图中Module name
为demo1-maven-plugin
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BQYFhk4B-1629908740273)(media/9232592562dfd46319347e713a1e5ea0.png)]
点击上图的Finish
,如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZmWOh5aY-1629908740274)(media/777d3f4b80daea8a8093d213e9b69056.png)]
点击上图中的OK
按钮,完成创建工作,目前项目结构如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mm41mWs0-1629908740276)(media/57ea1926e393f42d111656298fe32704.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sV5z5EbH-1629908740278)(media/001c0955f125c404dde6288ba70e092a.png)]
demo1-maven-plugin/pom.xml
中packaging
的值为maven-plugin
,如下maven-plugin
demo1-maven-plugin/pom.xml
引入插件需要的依赖
org.apache.maven
maven-plugin-api
3.0
org.apache.maven.plugin-tools
maven-plugin-annotations
3.4
provided
最后demo1-maven-plugin/pom.xml
内容如下
version="1.0" encoding="UTF-8"
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"
4.0.0
com.javacode2018
demo1-maven-plugin
1.0-SNAPSHOT
maven-plugin
UTF-8
1.8
1.8
1.8
org.apache.maven
maven-plugin-api
3.0
org.apache.maven.plugin-tools
maven-plugin-annotations
3.4
provided
org.apache.maven.plugins
maven-plugin-plugin
3.4
在demo-maven-plugin
中创建的目标类com.javacode2018.Demo1Mojo
,需要继承org.apache.maven.plugin.AbstractMojo
,需要实现@Mojo注解
,如下:
com.javacode2018;
org.apache.maven.plugin.AbstractMojo;
org.apache.maven.plugin.MojoExecutionException;
org.apache.maven.plugin.MojoFailureException;
org.apache.maven.plugins.annotations.Mojo;
工作1、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:马士兵老师
@Mojo(name = "demo1")
Demo1Mojo AbstractMojo {
void execute() MojoExecutionException, MojoFailureException {
}
}
注意上面注解@Mojo(name = "demo1")
,name
使用来标注目标的名称为demo1
。
execute
方法我们在execute
方法中输出一句话
.getLog().info("hello my first maven plugin!");
目前execute方法代码如下:
void execute() MojoExecutionException, MojoFailureException {
.getLog().info("hello my first maven plugin!");
}
在maven-chat10/pom.xml
目录执行下面命令:
mvn clean install -pl :demo1-maven-plugin
注意上面命令和在
demo1-maven-plugin/pom
中执行mvn clean install
效果是一样的,只是这个地方使用了maven裁剪的功能,对这块命令不熟悉的可以看:Maven系列第8篇:大型Maven项目,快速按需任意构建,必备神技能!
上面命令效果如下:
D:\code\IdeaProjects\maven-chat10>mvn clean install -pl :demo1-maven-plugin
[INFO] Scanning projects...
[INFO]
[INFO] ----------------< com.javacode2018:demo1-maven-plugin >-----------------
[INFO] Building demo1-maven-plugin 1.0-SNAPSHOT
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (-clean) @ demo1-maven-plugin ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (-resources) @ demo1-maven-plugin ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ demo1-maven-plugin ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\classes
[INFO]
[INFO] --- maven-plugin-plugin:3.4:descriptor (-descriptor) @ demo1-maven-plugin ---
[INFO] Using 'UTF-8' encoding to read mojo metadata.
[INFO] Mojo extractor with id: java-javadoc found 0 mojo descriptors.
[INFO] Mojo extractor with id: java-annotations found 1 mojo descriptors.
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ demo1-maven-plugin ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ demo1-maven-plugin ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ demo1-maven-plugin ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (-jar) @ demo1-maven-plugin ---
[INFO] Building jar: D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\demo1-maven-plugin-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-plugin-plugin:3.4:addPluginArtifactMetadata (-addPluginArtifactMetadata) @ demo1-maven-plugin ---
[INFO]
[INFO] --- maven-install-plugin:2.4:install (-install) @ demo1-maven-plugin ---
[INFO] Installing D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\target\demo1-maven-plugin-1.0-SNAPSHOT.jar to C:\Users\Think\.m2\repository\com\javacode2018\demo1-maven-plugin\1.0-SNAPSHOT\demo1-maven-plugin-1.0-SNAPSHOT.jar
[INFO] Installing D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin\pom.xml to C:\Users\Think\.m2\repository\com\javacode2018\demo1-maven-plugin\1.0-SNAPSHOT\demo1-maven-plugin-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 5.402 s
[INFO] Finished at: 2019-11-26T15:21:26+08:00
[INFO] ------------------------------------------------------------------------
maven-chat10/pom.xml
所在目录执行:
mvn com.javacode2018:demo1-maven-plugin:demo1
效果如下:
D:\code\IdeaProjects\maven-chat10>mvn com.javacode2018:demo1-maven-plugin:demo1
[INFO] Scanning projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] demo1-maven-plugin [maven-plugin]
[INFO] maven-chat10 [pom]
[INFO]
[INFO] ----------------< com.javacode2018:demo1-maven-plugin >-----------------
[INFO] Building demo1-maven-plugin 1.0-SNAPSHOT [1/2]
[INFO] ----------------------------[ maven-plugin ]----------------------------
[INFO]
[INFO] --- demo1-maven-plugin:1.0-SNAPSHOT:demo1 (-cli) @ demo1-maven-plugin ---
[INFO] hello my first maven plugin!
[INFO]
[INFO] -------------------< com.javacode2018:maven-chat10 >--------------------
[INFO] Building maven-chat10 1.0-SNAPSHOT [2/2]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- demo1-maven-plugin:1.0-SNAPSHOT:demo1 (-cli) @ maven-chat10 ---
[INFO] hello my first maven plugin!
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary maven-chat10 1.0-SNAPSHOT:
[INFO]
[INFO] demo1-maven-plugin ..............................SUCCESS [ 0.358 s]
[INFO] maven-chat10 ....................................SUCCESS [ 0.042 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.656 s
[INFO] Finished at: 2019-11-26T13:49:30+08:00
上面输出的东西比较多,我们主要看一下有这样的一句输出,如下:
[INFO] hello my first maven plugin!
上面这个输出就是我们在execute
方法中输出的内容。
上面我们介绍了开发一个插件目标详细的实现过程,然后写了一个简单的案例,比较简单。不过自定义的Mojo
如果没有参数,那么这个Mojo
基本上也实现不了什么复杂的功能,下面我们来看一下Mojo中如何使用参数。
定义参数就像在mojo中创建一个实例变量并添加适当的注释一样简单。下面列出了一个简单mojo的参数示例:
要显示的问候语。
@Parameter( property = "sayhi.greeting", defaultValue = "Hello World!" )
String greeting;
@Parameter注解之前的部分是参数的描述,这个注解将变量标识为mojo参数。注解的defaultValue参数定义变量的默认值,此值maven的属性值,例如“${project.version}”(更多信息可以看上一篇文章中的
target="_blank">maven属性部分),property参数可用于通过引用用户通过-D选项设置的系统属性,即通过从命令行配置mojo参数,如mvn ... \-Dsayhi.greeting=马士兵老师
可以将马士兵老师
的值传递给greeting
参数,这个注解还有几个属性大家有兴趣的可以自己去研究一下。
com.javacode2018
demo1-maven-plugin
1.0-SNAPSHOT
欢迎您和【马士兵老师】一起学习Maven技术!
上面设置的是一个string类型的greeting
参数的值,还有其他很多类型定义以及使用,我们也来看一下。
My boolean
@Parameter
boolean myBoolean;
true
数字类型包含:byte
, Byte
, int
, Integer
, long
, Long
, short
,
Short
,读取配置时,XML文件中的文本将使用适当类的integer.parseInt()或valueOf()方法转换为整数值,这意味着字符串必须是有效的十进制整数值,仅由数字0到9组成,前面有一个可选的-表示负值。例子:
My Integer
@Parameter
Integer myInteger;
10
读取配置时,XML文件中的文本用作所需文件或目录的路径。如果路径是相对的(不是以/或C:之类的驱动器号开头),则路径是相对于包含POM的目录的。例子:
My File
@Parameter
File myFile;
c:\temp
Color {
GREEN,
RED,
BLUE
}
My Enum
@Parameter
Color myColor;
GREEN
My Array
@Parameter
String[] myArray;
value1
value2
My List
@Parameter
List myList;
value1
value2
My Map
@Parameter
Map myMap;
value1
value2
java.util.Properties
的类型
My Properties
@Parameter
Properties myProperties;
propertyName1
propertyValue1
propertyName2
propertyValue2
My Object
@Parameter
MyObject myObject;
test
我们将上面各种类型的参数都放到Demo1Mojo中,Demo1Mojo类如下:
com.javacode2018;
org.apache.maven.plugin.AbstractMojo;
org.apache.maven.plugin.MojoExecutionException;
org.apache.maven.plugin.MojoFailureException;
org.apache.maven.plugins.annotations.Mojo;
org.apache.maven.plugins.annotations.Parameter;
java.io.File;
java.lang.reflect.Field;
java.util.Arrays;
java.util.List;
java.util.Map;
java.util.Properties;
工作1、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:马士兵老师
@Mojo(name = "demo1")
Demo1Mojo AbstractMojo {
要显示的问候语。
@Parameter(property = "sayhi.greeting", defaultValue = "Hello World!")
String greeting;
My boolean
@Parameter
boolean myBoolean;
My Integer
@Parameter
Integer myInteger;
My File
@Parameter
File myFile;
Color {
GREEN,
RED,
BLUE
}
My Enum
@Parameter
Color myColor;
My Array
@Parameter
String[] myArray;
My List
@Parameter
List myList;
My Map
@Parameter
Map myMap;
My Properties
@Parameter
Properties myProperties;
static Person {
String name;
int age;
String getName() {
name;
}
void setName(String name) {
.name = name;
}
int getAge() {
age;
}
void setAge(int age) {
.age = age;
}
@Override
String toString() {
"Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@Parameter
Person person;
void execute() MojoExecutionException, MojoFailureException {
.getLog().info("hello my first maven plugin!");
Field[] declaredFields = Demo1Mojo.class.getDeclaredFields();
Arrays.stream(declaredFields).forEach(f -> {
(f.isAccessible()) {
f.setAccessible();
}
{
.getLog().info(f.getName() + ":" + f.get());
} (IllegalAccessException e) {
.getLog().warn(e);
}
});
}
}
demo1-maven-plugin
安装到本地仓库maven-chat10/pom.xml
所在目录运行:
mvn clean install -pl :demo1-maven-plugin
demo1-maven-plugin-test
使用idea创建,过程和demo1-maven-plugin
过程类似,可以直接参考,创建好了,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sHOpDZgZ-1629908740282)(media/edb9a2565e73f9d1a408d2dc67fc6293.png)]
修改demo1-mavein-plugin-test/pom.xml
文件,加入下面内容:
com.javacode2018
demo1-maven-plugin
1.0-SNAPSHOT
demo1 plugin test
pre-clean
demo1
true
30
${project.basedir}
BLUE
maven
spring
mybatis
springboot
springcloud
30
35
马士兵老师
30
name
javacode2018
age
30
马士兵老师
32
上面是将生命周期的pre-clean
阶段绑定插件demo1-maven-plugin
的demo1
目标,并且设置了demo1
目标所需要的所有参数的值。
在maven-chat10/pom.xml
所在目录执行:
D:\code\IdeaProjects\maven-chat10>mvn pre-clean -pl :demo1-maven-plugin-test -Dsayhi.greeting="欢迎和【马士兵老师】一起学习Maven!"
[INFO] Scanning projects...
[INFO]
[INFO] --------------< com.javacode2018:demo1-maven-plugin-test >--------------
[INFO] Building demo1-maven-plugin-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- demo1-maven-plugin:1.0-SNAPSHOT:demo1 (demo1 plugin test) @ demo1-maven-plugin-test ---
[INFO] hello my first maven plugin!
[INFO] greeting:欢迎和【马士兵老师】一起学习Maven!
[INFO] myBoolean:
[INFO] myInteger:30
[INFO] myFile:D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-test
[INFO] myColor:BLUE
[INFO] myArray:[Ljava.lang.String;@7bf9b098
[INFO] myList:[30, 35]
[INFO] myMap:{age=30, name=马士兵老师}
[INFO] myProperties:{age=30, name=javacode2018}
[INFO] person:Person{name='马士兵老师', age=32}
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.517 s
[INFO] Finished at: 2019-11-26T15:42:53+08:00
[INFO] ------------------------------------------------------------------------
在案例1中,我们使用下面命令调用的插件:
mvn com.javacode2018:demo1-maven-plugin:demo1
这种是采用下面这种格式:
mvn 插件groupId:插件artifactId[:插件版本]:插件目标名称
命令中插件版本是可以省略的,maven会自动找到这个插件最新的版本运行,不过最好我们不要省略版本号,每个版本的插件功能可能不一样,为了保证任何情况下运行效果的一致性,强烈建议指定版本号。
上面执行插件需要插件的坐标信息,一长串比较麻烦,maven也为了我们使用插件方便,提供了插件前缀来帮我们解决这个问题。
自定义插件的artifactId
满足下面的格式:
xxx-maven-plugin
如果采用这种格式的maven会自动将xxx
指定为插件的前缀,其他格式也可以,不过此处我们只说这种格式,这个是最常用的格式。
如我们上面的demo1-maven-plugin
插件,他的前缀就是demo1
。
当我们配置了插件前缀,可以插件前缀来调用插件的目标了,命令如下:
mvn 插件前缀:插件目标
maven是如何通过插件前缀找到具体的插件的呢?
maven默认会在仓库"org.apache.maven.plugins" 和 "org.codehaus.mojo"
2个位置查找插件,比如:
mvn clean:help
这个是调用maven-clean-plugin
插件的help
目标,maven-clean-plugin
的前缀就是clean
,他的groupId
是org.apache.maven.plugins
,所以能够直接找到。
但是我们自己定义的插件,如果也让maven能够找到,需要下面的配置。
~/.m2/settings.xml
中配置自定义插件组在pluginGroups
中加入自定义的插件组groupId
,如:
com.javacode2018
这样当我们通过前缀调用插件的时候,maven除了会在2个默认的组中查找,还会在这些自定义的插件组中找,一般情况下我们自定义的插件通常使用同样的groupId
。
mvn 插件前缀:插件目标
在~/.m2/settings.xml
中加入下面配置:
com.javacode2018
在maven-chat10/pom.xml
所在目录执行:
mvn demo1:demo1 -pl demo1-maven-plugin-test
效果如下:
D:\code\IdeaProjects\maven-chat10>mvn demo1:demo1 -pl demo1-maven-plugin-test
[INFO] Scanning projects...
[INFO]
[INFO] --------------< com.javacode2018:demo1-maven-plugin-test >--------------
[INFO] Building demo1-maven-plugin-test 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- demo1-maven-plugin:1.0-SNAPSHOT:demo1 (-cli) @ demo1-maven-plugin-test ---
[INFO] hello my first maven plugin!
[INFO] greeting:Hello World!
[INFO] myBoolean:
[INFO] myInteger:
[INFO] myFile:
[INFO] myColor:
[INFO] myArray:
[INFO] myList:
[INFO] myMap:
[INFO] myProperties:
[INFO] person:
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.786 s
[INFO] Finished at: 2019-11-26T16:10:41+08:00
[INFO] ------------------------------------------------------------------------
上面直接通过插件的前缀来调用插件的功能了,是不是很爽!
maven中将构件打包为可以执行的jar的插件,maven已经帮我们提供了,如下:
org.apache.maven.plugins
maven-shade-plugin
3.2.1
package
shade
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"
启动类完整路径
上面使用到了maven官方提供的一个打包的插件,可以将构件打包为可以直接运行的jar包。
插件中需要通过java命令调用打包好的jar包,然后运行。
demo1-maven-plugin
中创建一个插件目标类,如下:
com.javacode2018;
org.apache.maven.plugin.AbstractMojo;
org.apache.maven.plugin.MojoExecutionException;
org.apache.maven.plugin.MojoFailureException;
org.apache.maven.plugins.annotations.Execute;
org.apache.maven.plugins.annotations.LifecyclePhase;
org.apache.maven.plugins.annotations.Mojo;
org.apache.maven.plugins.annotations.Parameter;
java.io.BufferedReader;
java.io.IOException;
java.io.InputStreamReader;
工作1、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:马士兵老师
@Mojo(name = "run", defaultPhase = LifecyclePhase.PACKAGE)
@Execute(phase = LifecyclePhase.PACKAGE)
RunMojo AbstractMojo {
打包好的构件的路径
@Parameter(defaultValue = "${project.build.directory}\\${project.artifactId}-${project.version}.jar")
String jarPath;
@Override
void execute() MojoExecutionException, MojoFailureException {
{
.getLog().info("Started:" + .jarPath);
ProcessBuilder builder = ProcessBuilder("java", "-jar", .jarPath);
final Process process = builder.start();
Thread(() -> {
BufferedReader reader = BufferedReader( InputStreamReader(process.getInputStream()));
{
String s;
((s = reader.readLine()) != ) {
System.out.println(s);
}
} (IOException e) {
e.printStackTrace();
}
}).start();
Runtime.getRuntime().addShutdownHook( Thread() {
@Override
void run() {
RunMojo.this.getLog().info("Destroying...");
process.destroy();
RunMojo.this.getLog().info("Shutdown hook finished.");
}
});
process.waitFor();
.getLog().info("Finished.");
} (Exception e) {
.getLog().warn(e);
}
}
}
上面这个插件目标的名称为
run
注意这个类上面多了一个注解
@Execute
,这个注解可以配置这个目标执行之前可以先执行的生命周期的阶段
或者需要先执行的插件目标
。
上面配置的是
phase = LifecyclePhase.PACKAGE
,也就是说当我们运行上面run
目标的时候,会先执行构件的package
阶段,也就是先执行项目的打包阶段,打包完成之后才会执行run
目标。
maven-chat10/pom.xml
所在目录运行:
mvn clean install -pl :demo1-maven-plugin
demo1-maven-plugin-run
使用idea创建,过程和demo1-maven-plugin
过程类似,可以直接参考,创建好了,如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVExJbmU-1629908740285)(media/93f853548bb2ce5b7caac093e722bc4b.png)]
com.javacode2018.Demo
类在demo1-maven-plugin-run\src\main\java创建下面类:
com.javacode2018;
java.util.Calendar;
java.util.concurrent.TimeUnit;
工作1、算法、数据库方面的技术干货!坚信用技术改变命运,让家人过上更体面的生活!喜欢的请关注公众号:马士兵老师
Demo1 {
static void main(String[] args) InterruptedException {
(int i = 0; i < 1000; i++) {
System.out.println(Calendar.getInstance().getTime() + ":" + i);
TimeUnit.SECONDS.sleep(1);
}
}
}
demo1-maven-plugin-run/pom.xml
,如下 version="1.0" encoding="UTF-8"
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"
4.0.0
com.javacode2018
demo1-maven-plugin-run
1.0-SNAPSHOT
UTF-8
1.8
1.8
1.8
org.apache.maven.plugins
maven-shade-plugin
3.2.1
package
shade
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"
com.javacode2018.Demo1
在maven-chat10/pom.xml
所在目录执行下面的命令:
mvn clean demo1:run -pl demo1-maven-plugin-run
输出如下:
D:\code\IdeaProjects\maven-chat10>mvn clean demo1:run -pl demo1-maven-plugin-run
[INFO] Scanning projects...
[INFO]
[INFO] --------------< com.javacode2018:demo1-maven-plugin-run >---------------
[INFO] Building demo1-maven-plugin-run 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (-clean) @ demo1-maven-plugin-run ---
[INFO] Deleting D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\target
[INFO]
[INFO] >>> demo1-maven-plugin:1.0-SNAPSHOT:run (-cli) > @ demo1-maven-plugin-run >>>
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (-resources) @ demo1-maven-plugin-run ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (-compile) @ demo1-maven-plugin-run ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (-testResources) @ demo1-maven-plugin-run ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (-testCompile) @ demo1-maven-plugin-run ---
[INFO] Nothing to compile - all classes are up to date
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (-test) @ demo1-maven-plugin-run ---
[INFO] No tests to run.
[INFO]
[INFO] --- maven-jar-plugin:2.4:jar (-jar) @ demo1-maven-plugin-run ---
[INFO] Building jar: D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\target\demo1-maven-plugin-run-1.0-SNAPSHOT.jar
[INFO]
[INFO] --- maven-shade-plugin:3.2.1:shade () @ demo1-maven-plugin-run ---
[INFO] Replacing original artifact with shaded artifact.
[INFO] Replacing D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\target\demo1-maven-plugin-run-1.0-SNAPSHOT.jar with D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\target\demo1-maven-plugin-run-1.0-SNAPSHOT-shaded.jar
[INFO]
[INFO] <<< demo1-maven-plugin:1.0-SNAPSHOT:run (-cli) < @ demo1-maven-plugin-run <<<
[INFO]
[INFO]
[INFO] --- demo1-maven-plugin:1.0-SNAPSHOT:run (-cli) @ demo1-maven-plugin-run ---
[INFO] Started:D:\code\IdeaProjects\maven-chat10\demo1-maven-plugin-run\target\demo1-maven-plugin-run-1.0-SNAPSHOT.jar
Tue Nov 26 17:24:47 CST 2019:0
Tue Nov 26 17:24:48 CST 2019:1
Tue Nov 26 17:24:49 CST 2019:2
Tue Nov 26 17:24:50 CST 2019:3
Tue Nov 26 17:24:51 CST 2019:4
Tue Nov 26 17:24:52 CST 2019:5
Tue Nov 26 17:24:53 CST 2019:6
Tue Nov 26 17:24:54 CST 2019:7
Tue Nov 26 17:24:55 CST 2019:8
Tue Nov 26 17:24:56 CST 2019:9
Tue Nov 26 17:24:57 CST 2019:10
Tue Nov 26 17:24:58 CST 2019:11
Tue Nov 26 17:24:59 CST 2019:12
Tue Nov 26 17:25:00 CST 2019:13
是不是打包+运行很简单,一行命令就搞定了。
后面我们需要学的springboot中也是一个maven命令就可以启动springboot项目,这个原理和我们上面的类似,是spring官方他们自己开发了一款maven插件,可以直接运行springboot项目,后面学习springboot的时候,我们会详细介绍。
本文的内容起到一个抛砖引玉的作用,大家如果有兴趣,可以去写很多更好的maven插件玩玩,maven默认提供了很多优秀的插件,大家可以去看他们的源码,借鉴他们的设计思路,开发出自己喜欢的插件使用
maven系列到此已经结束了,后面将进行mybatis、springboot、springcloud系列,所有系列的目标都是让大家掌握从入门到高级开发所需要的所有技能。
Maven系列:第1篇:Maven未出世前,我们那些痛苦的经历!
Maven系列第2篇:安装、配置、mvn运行过程详解
Maven系列第3篇:详解maven解决依赖问题
Maven系列第4篇:仓库详解
Maven系列第5篇:私服详解
Maven系列第6篇:生命周期和插件详解,高手必备!
Maven系列第7篇:聚合、继承、单继承问题详解,必备技能!
Maven系列第8篇:大型Maven项目,快速按需任意构建,必备神技能!
Maven系列第9篇:多环境构建,作为核心开发,这个玩不转有点说不过去!
emo1-maven-plugin-run-1.0-SNAPSHOT.jar
Tue Nov 26 17:24:47 CST 2019:0
Tue Nov 26 17:24:48 CST 2019:1
Tue Nov 26 17:24:49 CST 2019:2
Tue Nov 26 17:24:50 CST 2019:3
Tue Nov 26 17:24:51 CST 2019:4
Tue Nov 26 17:24:52 CST 2019:5
Tue Nov 26 17:24:53 CST 2019:6
Tue Nov 26 17:24:54 CST 2019:7
Tue Nov 26 17:24:55 CST 2019:8
Tue Nov 26 17:24:56 CST 2019:9
Tue Nov 26 17:24:57 CST 2019:10
Tue Nov 26 17:24:58 CST 2019:11
Tue Nov 26 17:24:59 CST 2019:12
Tue Nov 26 17:25:00 CST 2019:13
**是不是打包+运行很简单,一行命令就搞定了。**
后面我们需要学的springboot中也是一个maven命令就可以启动springboot项目,这个原理和我们上面的类似,是spring官方他们自己开发了一款maven插件,可以直接运行springboot项目,后面学习springboot的时候,我们会详细介绍。
## 总结
**本文的内容起到一个抛砖引玉的作用,大家如果有兴趣,可以去写很多更好的maven插件玩玩,maven默认提供了很多优秀的插件,大家可以去看他们的源码,借鉴他们的设计思路,开发出自己喜欢的插件使用**
**maven系列到此已经结束了,后面将进行mybatis、springboot、springcloud系列,所有系列的目标都是让大家掌握从入门到高级开发所需要的所有技能。**
## Maven系列目录
1. Maven系列:第1篇:Maven未出世前,我们那些痛苦的经历!
2. Maven系列第2篇:安装、配置、mvn运行过程详解
3. Maven系列第3篇:详解maven解决依赖问题
4. Maven系列第4篇:仓库详解
5. Maven系列第5篇:私服详解
6. Maven系列第6篇:生命周期和插件详解,高手必备!
7. Maven系列第7篇:聚合、继承、单继承问题详解,必备技能!
8. Maven系列第8篇:大型Maven项目,快速按需任意构建,必备神技能!
9. Maven系列第9篇:多环境构建,作为核心开发,这个玩不转有点说不过去!