---
title: 常用的Maven插件记录
tags:
- JVM
- Java
- Maven
- Plugins
categories:
- - JVM
- 构建工具
keywords: 'maven,plugins,插件'
date: 2021-06-10 17:32:15
---
Maven是一个依赖插件执行的框架,每个任务实际上都是由插件完成的。插件通常提供的是一个目标(goal)的集合,也就是命令行格式`mvn [options] [goals] [phases]`中的`[goals]`。要执行一个插件的目标,可以使用命令格式`mvn [plugin-name]:[goal-name]`,例如`mvn jetty:run`。
在Maven中有Build和Report两种类型的插件,其中Build用于在构建时执行,Report用于在网站生成过程中执行。
每个插件可以有多个目标,插件可以使用`phase`元素来定义执行时机。要执行的任务则需要绑定到插件的目标上来执行。以下给出一个示例。
```xml
org.apache.maven.plugins
maven-antrun-plugin
1.1
on.clean
clean
run
Now in clean phase.
```
!!! info "plugins和pluginManagemen标签的区别"
`plugins`和`pluginManagement`两个标签都是`build`标签的直接子元素,而且大部分POM文件中都可以看到它们。但是这两个标签的使用是有区别的,其中`pluginManagement`标签所声明的插件并不会被Maven所使用,它的作用主要是提供对于所有继承了当前POM的子POM中所使用的插件的版本。而`plugins`则是将插件实实在在的应用到Maven生命周期中的。换句话说,如果项目是由多个POM文件组成的,那么可以使用`pluginManagement`来约束各个POM文件中所使用的插件版本;如果只有一个POM文件,那么可以仅使用`plugins`声明插件的使用即可。
## maven-compiler-plugin
Compiler插件主要用来编译项目源码。在POM中一般用来配置编译所接受的源码版本和编译后能够适应的Java运行时版本。代码版本的配置有两种方式,一种是通过配置项指定,一种是通过配置插件指定。
以下是通过配置项指定的示例。
```xml
1.8
1.8
```
或者可以直接配置插件。
```xml
org.apache.maven.plugins
maven-compiler-plugin
3.8.1
1.8
1.8
```
## maven-antrun-plugin
Antrun插件用来在一些指定阶段中运行Ant任务,并且对书写在POM中的Ant任务提供支持。Antrun插件在前面一些章节已经有所接触,其具体使用格式如下。
```xml
maven-antrun-plugin
1.8
run
```
## maven-jar-plugin
Jar插件主要用来增强构建Jar包的功能,为Jar包中增加`MANIFEST.MF`文件,或者通过提供`MANIFEST.MF`中所需的内容来自动构建`MANIFEST.MF`文件。
以下示例可以打包一个可执行的Jar包。
```xml
maven-jar-plugin
3.2.0
true
lib/
com.example.MainApp
```
配置好的项目可以通过命令`mvn jar:jar`来完成打包。
## maven-shade-plugin
Shade插件是用来建立Uber-Jar(FatJar)的。Uber-Jar将所有的依赖都包含在了Jar包中,在运行时可以不受外界运行时环境的影响。Shade插件提供了两个目标,但其中只有`shade:shade`是用来打包的。
使用以下最简单的配置就可以打出一个Uber-Jar包。
```xml
maven-shade-plugin
3.2.1
package
shade
```
要创建一个可执行的Jar包,就需要指定主类,主类是在`execution`元素中的`configuration`元素中定义的。
```xml
com.example.MainApp
```
常用的`Transformer`类都定义在`org.apache.maven.shade.resources`包中,主要有以下这些。
* `AppendingTransformer`,向资源中添加一个内容。
* `IncludeResourcesTransformer`,向项目中添加文件。
* `ManifestResourcesTransformer`,向`MANIFEST.MF`中设定内容。
* `XmlAppendingTransformer`,向XML资源中添加一个XML文件。
除此之外,`configuration`元素中还可以使用以下子元素来实现相应的功能。
* `filters/filter/[includes|excludes]`,过滤Jar包中的类或者资源。
* `artifactSet/[includes|excludes]`,指定需要打包的Jar。
* `minimizedJar`,自动排除不使用的类。
## maven-assembly-plugin
Assembly插件是用来执行定制化打包操作的。Assembly插件提供了两种打包方式,第一种是通过`descriptorRefs`元素来指定使用官方统一定制的打包方式,常用的主要有`bin`、`jar-with-dependencies`、`src`等。
官方统一定制的打包方式可以使用以下方式配置。
```xml
maven-assembly-plugin
3.2.0
jar-with-dependencies
```
另一种定制打包方式是使用`descriptors`元素来指定打包配置文件,通过配置文件来定制打包操作。这种方式的用法如下例所示。
```xml
maven-assembly-plugin
3.2.0
src/assembly/src.xml
```
打包配置文件也是一个XML文件,以下是其中可以使用的示例格式以及各个元素的含义,更详细的配置文件格式需要参考[Assembly插件](https://maven.apache.org/plugins/maven-assembly-plugin/assembly.html)的文档。
```xml
0755
```
## exec-maven-plugin
Exec插件主要用来支持Maven快速启动Java程序,可以在不打包为Jar文件时快捷的启动程序,而无需等待漫长的打包时间。Exec插件提供了两个目标可供使用:`exec:java`和`exec:exec`。其中`exec:java`可以用来启动比较简单不需要复杂命令行配置的Java应用,而`exec:exec`则更适合于启动需要复杂配置的应用。
以下配置了`exec:java`目标来启动Java应用。
```xml
org.codehaus.mojo
exec-maven-plugin
1.6.0
java
com.example.MainApp
...
```
使用`exec:exec`目标就更加复杂,但可以更加灵活。
```xml
org.codehaus.mojo
exec-maven-plugin
1.6.0
exec
java
```
## jpackage-maven-plugin
jpackage插件是一个第三方插件,用来调用JDK 14以后引入的jpackage命令来将经过裁剪生成的最简运行时打包为可在不同平台上直接运行的程序包的。jpackage插件值提供了一个目标可供使用:`jpackage:jpackage`。因为不是所有的JDK都带有jpackage命令,所以在使用jpackage插件的时候,需要配置的内容主要是jpackage所在的JDK目录以及所需要打包的Runtime。
以下是一个打包已经使用jlink裁剪好的Runtime的示例。
```xml
com.github.akman
jpackage-maven-plugin
0.1.2
${env.JPACKAGE_HOME}
${project.build.directory}/jpackage
appname
IMAGE
${project.build.directory}/jlink/runtime-image
1.0
Copyright
Description
Vendor
${project.basedir}/config/jpackage/resources/appname.ico
appModuleName/appClassName
--opt
-Dfile.encoding=UTF-8 -Xms256m -Xmx512m
appname-cli
appModuleName/appClassName
--help
-Xms256m -Xmx512m
1.0
${project.basedir}/config/jpackage/resources/appname-cli.ico
true
${project.basedir}/config/jpackage/resources
```