maven插件
Maven 插件全解析:从基础到高级应用
Maven 作为一款强大的项目管理工具,其核心功能完全依赖插件实现。无论是编译代码、打包项目,还是生成报告,都需要通过插件完成。本文将系统介绍 Maven 插件的分类、常用插件配置及调用方式,帮助你灵活掌控项目构建流程。
Maven 插件基础
插件的本质
Maven 插件是实现特定功能的 Java 类,通过 “目标(Goal)” 定义具体操作(如编译、打包)。每个插件可包含多个目标,例如 maven-compiler-plugin 包含 compile(编译主代码)和 testCompile(编译测试代码)两个目标。
插件语法
调用插件的基本格式:
mvn [插件前缀]:[目标]
- 示例:
mvn compiler:compile(调用编译插件的compile目标)。
插件分类
- 构建插件(Build Plugins):参与项目构建过程,如编译、打包、测试等,默认绑定到 Maven 生命周期的特定阶段。
示例:maven-compiler-plugin、maven-jar-plugin。 - 报告插件(Reporting Plugins):生成项目报告(如测试覆盖率、依赖分析),默认绑定到
site生命周期。
示例:maven-javadoc-plugin、maven-surefire-report-plugin。
常用核心插件详解
编译插件:maven-compiler-plugin
功能:指定 Java 编译版本,确保代码兼容性。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source> <!-- 源码兼容版本 -->
<target>1.8</target> <!-- 编译后 class 版本 -->
<encoding>UTF-8</encoding> <!-- 编码格式 -->
<fork>true</fork> <!-- 独立进程编译,避免冲突 -->
</configuration>
</plugin>
说明:若不配置,Maven 默认使用 Java 1.5 兼容模式,需显式指定高版本(如 1.8)。
项目骨架插件:maven-archetype-plugin
功能:快速生成标准化项目结构(如普通 Java 项目、Web 项目)。
常用命令:
# 生成普通 Java 项目
mvn archetype:generate \
-DarchetypeArtifactId=maven-archetype-quickstart \
-DgroupId=com.zhanghe \
-DartifactId=myproject \
-Dversion=1.0-SNAPSHOT
# 生成 Web 项目
mvn archetype:generate \
-DarchetypeArtifactId=maven-archetype-webapp \
-DgroupId=com.zhanghe \
-DartifactId=mywebapp \
-Dversion=1.0-SNAPSHOT
打包插件:maven-jar-plugin 与 maven-war-plugin
maven-jar-plugin(Java 项目打包)
功能:自定义 Jar 包内容,指定主类实现可执行 Jar。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<archive>
<manifest>
<mainClass>com.zhanghe.Main</mainClass> <!-- 主类全路径 -->
<addClasspath>true</addClasspath> <!-- 自动添加类路径 -->
<classpathPrefix>lib/</classpathPrefix> <!-- 依赖存放目录 -->
</manifest>
</archive>
<includes> <!-- 仅打包指定文件 -->
<include>com/zhanghe/**/*.class</include>
</includes>
</configuration>
</plugin>
maven-war-plugin(Web 项目打包)
功能:定制 WAR 包结构(如排除冗余文件)。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
<configuration>
<warName>mywebapp</warName> <!-- 自定义 WAR 文件名 -->
<excludes> <!-- 排除不需要的文件 -->
<exclude>WEB-INF/classes/dev.properties</exclude>
</excludes>
</configuration>
</plugin>
依赖打包插件:maven-assembly-plugin 与 maven-shade-plugin
maven-assembly-plugin(灵活打包)
功能:将项目及依赖打包为 Jar、Zip、Tar 等格式,支持自定义目录结构。
配置示例:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<descriptors>
<!-- 自定义打包规则(需创建 src/main/assembly/assembly.xml) -->
<descriptor>src/main/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<phase>package</phase> <!-- 绑定到打包阶段 -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
assembly.xml 示例(打包为包含依赖的 Tar 包):
<assembly>
<id>dist</id> <!-- 包名后缀 -->
<formats><format>tar.gz</format></formats> <!-- 打包格式 -->
<fileSets>
<!-- 项目 Jar 包 -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes><include>*.jar</include></includes>
</fileSet>
<!-- 依赖包 -->
<fileSet>
<directory>${project.build.directory}/lib</directory>
<outputDirectory>/lib</outputDirectory>
</fileSet>
</fileSets>
</assembly>
maven-shade-plugin(解决依赖冲突)
功能:合并依赖类到 Jar 包,支持重命名类以避免冲突。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.4.1</version>
<executions>
<execution>
<phase>package</phase>
<goals><goal>shade</goal></goals>
<configuration>
<transformers>
<!-- 指定主类 -->
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>com.zhanghe.Main</mainClass>
</transformer>
</transformers>
<!-- 重命名冲突类(如将 com.google 改为 shaded.com.google) -->
<relocations>
<relocation>
<pattern>com.google</pattern>
<shadedPattern>shaded.com.google</shadedPattern>
</relocation>
</relocations>
</configuration>
</execution>
</executions>
</plugin>
依赖管理插件:maven-dependency-plugin
功能:分析依赖、复制依赖到指定目录,解决依赖冲突。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.3.0</version>
<executions>
<execution>
<phase>prepare-package</phase> <!-- 打包前执行 -->
<goals><goal>copy-dependencies</goal></goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory> <!-- 依赖输出目录 -->
<excludeScope>test</excludeScope> <!-- 排除测试依赖 -->
</configuration>
</execution>
</executions>
</plugin>
常用命令:
mvn dependency:tree:查看依赖树(分析冲突)。mvn dependency:analyze:检查未使用的依赖。dependency:list能够列出项目最终解析到的依赖列表;dependency:copy-dependencies能将项目依赖从本地Maven仓库复制到某个特定的文件夹下面
资源处理插件:maven-resources-plugin
功能:处理资源文件(如过滤变量、指定资源目录)。默认的主资源文件目录是src/main/resources,很多用户会需要添加额外的资源文件目录。此外,资源文件过滤也是Maven的一大特性,可以在资源文件中使用${propertyName}形式的Maven属性,然后配置maven-resources-plugin开启对资源文件的过滤,之后就可以针对不同环境通过命令行或者Profile传入属性的值,以实现更为灵活的构建
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<encoding>UTF-8</encoding> <!-- 资源文件编码 -->
</configuration>
<executions>
<execution>
<id>copy-resources</id>
<phase>process-resources</phase>
<goals><goal>copy-resources</goal></goals>
<configuration>
<outputDirectory>${project.build.directory}/classes</outputDirectory>
<resources>
<!-- 主资源目录 -->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering> <!-- 启用变量过滤(如 ${version}) -->
<includes>
<include>application.yml</include>
<include>application-${profileActive}.yml</include>
<include>mapper/**/*.xml</include>
<include>static/**</include>
<include>templates/**</include>
<include>*.xml</include>
<include>*.properties</include>
</includes>
</resource>
<!-- 额外资源目录 -->
<resource>
<directory>src/main/config</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
其他实用插件
maven-surefire-plugin:执行单元测试(默认绑定到test阶段)。maven-release-plugin:自动化版本发布(如从 SNAPSHOT 升级到 RELEASE)。release:prepare用来准备版本发布,具体的工作包括检查是否有未提交代码、检查是否有SNAPSHOT依赖、升级项目的SNAPSHOT版本至RELEASE版本、为项目打标签等等。release:perform是签出标签中的RELEASE源码,构建并发布。
maven-enforcer-plugin:强制检查规则(如禁止 SNAPSHOT 依赖、指定 Java 版本)。maven-help-plugin:查看有效 POM、插件信息(如mvn help:effective-pom)。
help:system可以打印所有可用的环境变量和Java系统属性help:effective-pom用来打印项目的有效POM,有效POM是指合并了所有父POM(包括Super POM)后的XML,当你不确定POM的某些信息从何而来时,就可以查看有效POMhelp:effective-settings用来打印项目的有效settings- maven-help-plugin的describe目标可以帮助你描述任何一个Maven插件的信息
- all-profiles目标和active-profiles目标帮助查看项目的Profile
插件的调用方式
绑定到生命周期阶段
将插件目标与 Maven 生命周期阶段(如 compile、package)绑定,执行阶段时自动触发目标。
示例:将 Thrift 编译插件绑定到 generate-sources 阶段:
<plugin>
<groupId>org.apache.thrift.tools</groupId>
<artifactId>maven-thrift-plugin</artifactId>
<version>0.1.10</version>
<executions>
<execution>
<phase>generate-sources</phase> <!-- 绑定阶段 -->
<goals><goal>compile</goal></goals> <!-- 执行目标 -->
</execution>
</executions>
</plugin>
说明:部分插件目标有默认绑定阶段(如 compiler:compile 默认绑定到 compile 阶段),可省略 <phase> 配置。
插件的目标本身可能在编写时就已经定义了默认绑定阶段,使用maven-help-plugin来查看插件的详细信息
命令行直接调用
通过 插件前缀:目标 直接执行,无需绑定生命周期。
示例:
mvn archetype:generate # 生成项目骨架
mvn dependency:tree # 查看依赖树
mvn help:effective-pom # 查看有效 POM
插件版本管理
始终指定插件的具体版本,避免因自动升级导致的兼容性问题:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version> <!-- 显式指定版本 -->
</plugin>
推荐:使用 Maven 中央仓库查询最新稳定版本(Maven Repository)