1、Maven 框架本质
Maven 本质上是一个插件框架,其核心并不直接执行具体的构建任务,而是将这些任务交由插件完成。比如,编译源代码的任务由 maven-compiler-plugin
插件完成。具体而言,每个任务对应一个插件目标(goal),每个插件可能包含一个或多个目标。例如,maven-compiler-plugin
插件的 compile
目标用于编译位于 src/main/java/
目录下的主源码,而 testCompile
目标用于编译位于 src/test/java/
目录下的测试源码。
用户可以通过两种方式调用 Maven 插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户只需在命令行中输入生命周期阶段即可。例如,Maven 默认将 maven-compiler-plugin
的 compile
目标与 compile
生命周期阶段绑定,因此,执行命令 mvn compile
实际上是先定位到 compile
生命周期阶段,然后根据绑定关系调用 maven-compiler-plugin
的 compile
目标。第二种方式是直接在命令行中指定要执行的插件目标,例如 mvn archetype:generate
,表示调用 maven-archetype-plugin
的 generate
目标,这种带冒号的调用方式与生命周期无关。
了解 Maven 插件的基本概念有助于理解 Maven 的工作机制,但要更高效地使用 Maven,掌握一些常用的插件也非常重要。这不仅能帮助你避免重复发明轮子,还能大大提升构建效率。多年来,Maven 社区积累了大量经验,形成了一个成熟的插件生态圈。Maven 官方提供了两个插件列表。
- 第一个列表的 GroupId 为
org.apache.maven.plugins
,这些插件最为成熟,其地址为 Maven 官方插件列表。 - 第二个列表的 GroupId 为
org.codehaus.mojo
,这些插件虽然没有那么核心,但也非常实用,其地址为 Codehaus Mojo 插件列表。
下面将介绍一些常用的 Maven 插件,这些插件在不同环境下都表现出色,熟练使用它们可以让你的日常构建工作事半功倍。
2、Maven 官方插件
2.1、核心插件
Maven Core plugins(核心插件)是 Maven 自带的一些插件,它们在大多数 Maven 构建中都会被使用,并且不需要在 pom.xml
中显式导入就可以使用。核心插件包括一系列用于编译、测试、打包、安装、部署等构建任务的插件
Maven 官方的核心插件共有 9 种:
maven-clean-plugin
:用于清除项目目录中的垃圾文件和临时文件。主要插件目标clean:clean
适用于clean
生命周期阶段;maven-resources-plugin
:用于处理项目中的资源文件(复制和过滤资源文件)。主要插件目标resources:resources
和resources:testResources
适用于process-resources
和process-test-resources
生命周期阶段;maven-compiler-plugin
:用于编译项目中的源代码。主要插件目标compiler:compile
和compiler:testCompile
适用于compile
和test-compile
生命周期阶段;maven-surefire-plugin
:用于运行项目中的单元测试。主要插件目标surefire:test
适用于test
生命周期阶段;maven-failsafe-plugin
:用于运行集成测试。主要插件目标failsafe:integration-test
和failsafe:verify
适用于integration-test
和verify
生命周期阶段;maven-install-plugin
:用于将项目的包安装到本地仓库。主要插件目标install:install
适用于install
生命周期阶段;maven-deploy-plugin
:用于将项目的包部署到远程仓库。主要插件目标deploy:deploy
适用于deploy
生命周期阶段;maven-site-plugin
:用于生成项目的站点文档。主要插件目标site:site
和site:site-deploy
适用于site
和site-deploy
生命周期阶段;maven-verifier-plugin
:用于运行验证任务。主要插件目标verifier:verify
适用于verify
生命周期阶段。
2.2、打包类型(工具)
Maven 提供了多种打包插件,用于不同类型的项目和构建需求。
以下是常见的 10 种打包类型插件:
maven-ear-plugin
:用于创建企业级应用存档(EAR)文件。主要插件目标ear:ear
适用于package
生命周期阶段;maven-ejb-plugin
:用于创建企业 JavaBeans(EJB)模块。主要插件目标ejb:ejb
适用于package
生命周期阶段;maven-jar-plugin
:用于创建 Java ARchive(JAR)文件。主要插件目标jar:jar
适用于package
生命周期阶段;maven-rar-plugin
:用于创建资源适配器存档(RAR)文件。主要插件目标rar:rar
适用于package
生命周期阶段;maven-war-plugin
:用于创建 Web 应用程序存档(WAR)文件。主要插件目标war:war
适用于package
生命周期阶段;maven-app-client-plugin
:用于创建应用客户端模块(app-client/acr)。主要插件目标app-client:app-client
适用于package
生命周期阶段;maven-shade-plugin
:用于打包项目及其所有依赖项到一个可执行的 JAR 文件中。主要插件目标shade:shade
适用于package
生命周期阶段;maven-source-plugin
:用于打包项目的源代码到一个 JAR 文件中。主要插件目标source:jar
适用于package
生命周期阶段;maven-jlink-plugin
:用于创建定制的 Java 运行时映像(JRE)。主要插件目标jlink:jlink
适用于package
生命周期阶段;maven-jmod-plugin
:用于创建 Java 模块文件(JMOD)。主要插件目标jmod:jmod
适用于package
生命周期阶段。
2.3、报告插件
Maven 提供了多种报告插件,用于生成项目的各种报告。
以下是常见的 12 种报告插件:
maven-changelog-plugin
:用于生成项目的变更日志报告。主要插件目标changelog:changelog
适用于site
生命周期阶段;maven-changes-plugin
:用于生成项目的变更报告和发行说明。主要插件目标changes:changes
和changes:announcement-generate
适用于site
生命周期阶段;maven-checkstyle-plugin
:用于检查 Java 代码是否符合编码规范,并生成报告。主要插件目标checkstyle:checkstyle
适用于verify
生命周期阶段;maven-doap-plugin
:用于生成 DOAP(Description of a Project)报告。主要插件目标doap:generate
适用于site
生命周期阶段;maven-javadoc-plugin
:用于生成 JavaDoc 文档。主要插件目标javadoc:javadoc
和javadoc:test-javadoc
适用于site
生命周期阶段;maven-jepts-plugin
:用于生成项目的 JEPTS(Java Enterprise Project Testing System)报告。主要插件目标jepts:generate
适用于site
生命周期阶段;maven-jxr-plugin
:用于生成源代码交叉引用报告。主要插件目标jxr:jxr
适用于site
生命周期阶段;maven-linkcheck-plugin
:用于检查站点链接是否有效,并生成报告。主要插件目标linkcheck:linkcheck
适用于site
生命周期阶段;maven-pmd-plugin
:用于执行代码质量检查,并生成 PMD 报告。主要插件目标pmd:pmd
和pmd:cpd
适用于verify
生命周期阶段;maven-plugin-report-plugin
:用于生成 Maven 插件的报告。主要插件目标plugin-report:report
适用于site
生命周期阶段;maven-project-info-reports-plugin
:用于生成项目的各种信息报告。主要插件目标project-info-reports:project-info
适用于site
生命周期阶段;maven-surefire-report-plugin
:用于生成单元测试报告。主要插件目标surefire-report:report
和surefire-report:report-only
适用于site
生命周期阶段。
2.4、工具插件
Maven 提供了多种工具插件,用于不同的构建和管理任务。
以下是常见的工具插件:
-
maven-antrun-plugin
:用于在 Maven 构建中执行 Ant 任务。主要插件目标antrun:run
适用于compile
生命周期阶段; -
maven-artifact-plugin
:用于管理和操作构建工件。主要插件目标artifact:resolve
和artifact:resolve-transitively
适用于compile
生命周期阶段; -
maven-archetype-plugin
:用于创建 Maven 项目模板(archetypes)。主要插件目标archetype:generate
适用于generate-sources
生命周期阶段; -
maven-assembly-plugin
:用于创建包含项目及其依赖项的组装包。主要插件目标assembly:single
适用于package
生命周期阶段; -
maven-dependency-plugin
:用于处理项目依赖,包括解析、分析和报告依赖信息。主要插件目标dependency:copy
和dependency:resolve
适用于compile
生命周期阶段; -
maven-enforcer-plugin
:用于执行构建时的规则和策略。主要插件目标enforcer:enforce
适用于validate
生命周期阶段; -
maven-gpg-plugin
:用于对工件进行签名和验证。主要插件目标gpg:sign
和gpg:sign-and-deploy-file
适用于verify
和deploy
生命周期阶段; -
maven-help-plugin
:用于提供关于 Maven 项目的帮助信息。主要插件目标help:describe
和help:effective-pom
适用于validate
生命周期阶段; -
maven-invoker-plugin
:用于执行 Maven 构建的集成测试。主要插件目标invoker:install
和invoker:run
适用于integration-test
生命周期阶段; -
maven-jarsigner-plugin
:用于对 JAR 文件进行签名和验证。主要插件目标jarsigner:sign
和jarsigner:verify
适用于verify
生命周期阶段; -
maven-jedprscan-plugin
:用于执行 Java Enterprise Deployment Profile 扫描。主要插件目标jedprscan:scan
适用于verify
生命周期阶段; -
maven-patch-plugin
:用于创建和应用补丁。主要插件目标patch:patch
适用于validate
生命周期阶段; -
maven-pdf-plugin
:用于生成 PDF 格式的项目文档。主要插件目标pdf:pdf
适用于site
生命周期阶段; -
maven-plugin-plugin
:用于创建 Maven 插件。主要插件目标plugin:descriptor
和plugin:report
适用于compile
生命周期阶段; -
maven-release-plugin
:用于管理 Maven 项目的版本发布。主要插件目标release:prepare
和release:perform
适用于deploy
生命周期阶段; -
maven-remote-resources-plugin
:用于共享和同步资源。主要插件目标remote-resources:process
适用于generate-resources
生命周期阶段; -
maven-scm-plugin
:用于与源代码管理系统进行交互。主要插件目标scm:checkin
和scm:checkout
适用于validate
生命周期阶段; -
maven-scm-publish-plugin
:用于将生成的站点发布到 SCM 仓库。主要插件目标scm-publish:publish-scm
适用于site-deploy
生命周期阶段; -
maven-scripting-plugin
:用于在 Maven 构建中执行脚本。主要插件目标scripting:script
适用于compile
生命周期阶段; -
maven-stage-plugin
:用于管理项目的分阶段部署。主要插件目标stage:copy
和stage:move
适用于deploy
生命周期阶段; -
maven-toolchains-plugin
:用于配置和管理构建工具链。主要插件目标toolchains:toolchain
适用于initialize
生命周期阶段; -
maven-wrapper-plugin
:用于在项目中使用 Maven Wrapper。主要插件目标wrapper:wrapper
适用于generate-resources
生命周期阶段。
3、Retired(淘汰)类型插件
Maven 的 Retired 类型插件是指那些已经被官方弃用或不再维护的插件。这些插件可能被更强大或更现代的插件所取代,或者其功能已经被集成到其他插件或 Maven 核心中。
以下是一些常见的 Retired 类型插件及其用途:
maven-ant-plugin
:用于在 Maven 构建中执行 Ant 任务。主要插件目标ant:ant
适用于generate-sources
生命周期阶段。已被maven-antrun-plugin
取代;maven-docck-plugin
:用于检查 Javadoc 的完整性和一致性。主要插件目标docck:check
适用于verify
生命周期阶段。已被maven-javadoc-plugin
取代;maven-eclipse-plugin
:用于生成 Eclipse 项目文件。主要插件目标eclipse:eclipse
适用于generate-resources
生命周期阶段。已被 M2Eclipse(Eclipse 内置的 Maven 集成)取代;maven-idea-plugin
:用于生成 IntelliJ IDEA 项目文件。主要插件目标idea:idea
适用于generate-resources
生命周期阶段。已被 IDEA 的内置 Maven 支持取代;maven-one-plugin
:早期的综合性插件,包含了多个构建目标。已被细化为多个专用插件(如maven-jar-plugin
、maven-war-plugin
等);maven-reactor-plugin
:用于管理多模块项目的构建顺序。主要插件目标reactor:make
适用于none
(手动执行)。功能已被集成到 Maven 核心中;maven-repository-plugin
:用于管理本地和远程 Maven 仓库。主要插件目标repository:bundle-create
和repository:bundle-install
适用于install
和deploy
生命周期阶段。功能已被更现代的仓库管理工具取代;
这些插件已经被官方标记为弃用,不再推荐使用。在迁移到新的插件或工具时,用户应查阅最新的 Maven 文档和指南,以确保构建过程的兼容性和稳定性。
4、MojoHaus 插件
Codehaus Mojo 是一个开源项目,最初托管在 Codehaus 平台上。Codehaus 是一个支持开源项目的社区和平台,提供了许多有用的 Java 工具和项目。Codehaus Mojo 专注于创建和维护 Maven 插件,这些插件被广泛使用于 Maven 构建过程中。
后来 Codehaus Mojo 关闭,MojoHaus 是 Codehaus Mojo 的继任者,负责继续维护和发展这些 Maven 插件。MojoHaus 是一个社区驱动的项目,旨在提供一个托管和协作的环境,以确保这些插件能够持续更新和维护。MojoHaus 承接了 Codehaus Mojo 的大部分插件,并继续开发新的插件。
以下是一些常见的 MojoHaus 插件及其主要目标和生命周期阶段:
animal-sniffer-maven-plugin
:用于检查代码是否使用了特定 JDK 版本中的 API。主要插件目标check
适用于verify
生命周期阶段;build-helper-maven-plugin
:提供各种构建辅助功能,如添加源目录、创建时间戳等。主要插件目标add-source
、add-test-source
、timestamp-property
、parse-version
适用于generate-sources
和initialize
生命周期阶段;buildplan-maven-plugin
:用于生成构建计划报告。主要插件目标list
和show
适用于none
(手动执行);castor-maven-plugin
:用于将 XML 文件绑定到 Java 对象,或将 Java 对象转换为 XML。主要插件目标generate
适用于generate-sources
生命周期阶段;clirr-maven-plugin
:用于检查 Java 类库的二进制兼容性。主要插件目标check
适用于verify
生命周期阶段;javacc-maven-plugin
:用于生成 JavaCC(Java Compiler Compiler)解析器代码。主要插件目标javacc
和jjtree
适用于generate-sources
生命周期阶段;jdepend-maven-plugin
:用于生成项目的依赖性报告。主要插件目标generate
适用于site
生命周期阶段;naar-maven-plugin
:用于处理 NAAR(Nexus Artifact Archive)格式。主要插件目标archive
和extract
适用于package
和verify
生命周期阶段;native-maven-plugin
:用于编译和链接本地代码(如 C/C++)。主要插件目标compile
和link
适用于compile
生命周期阶段;sql-maven-plugin
:用于执行 SQL 脚本。主要插件目标execute
适用于initialize
生命周期阶段;taglist-maven-plugin
:用于生成源代码中的标签列表报告(如 TODO、FIXME)。主要插件目标taglist
适用于site
生命周期阶段;versions-maven-plugin
:用于检查和更新项目依赖版本。主要插件目标display-dependency-updates
和use-latest-versions
适用于validate
生命周期阶段。
5、其他著名非官方 Maven 插件
5.1、国内著名非官方插件
在国内,虽然 Maven 的官方插件和一些国际知名的社区插件(如 MojoHaus)被广泛使用,但也有一些国内开发者和社区贡献的非官方插件。这些插件通常针对本地需求和特定应用场景进行了优化。以下是一些在国内比较著名的非官方 Maven 插件:
-
maven-alibaba-plugin
:由阿里巴巴提供的插件,通常用于阿里巴巴内部项目构建和部署。这个插件集合包含了多个针对大规模分布式系统和微服务架构的工具; -
maven-dubbo-plugin
:用于 Dubbo 项目的插件,可以帮助开发者进行 Dubbo 服务的启动、停止、发布等操作。适用于package
和install
生命周期阶段; -
maven-jpom-plugin
:JPOM 是国内开源的一个运维平台,这个插件用于和 JPOM 集成,支持项目的构建、部署和运维管理。适用于deploy
和verify
生命周期阶段; -
maven-seata-plugin
:针对 Seata 分布式事务框架的插件,帮助管理 Seata 的配置和部署。适用于generate-resources
和package
生命周期阶段; -
maven-nacos-plugin
:用于管理 Nacos 配置和服务注册的插件,帮助在 Maven 构建过程中进行 Nacos 相关操作。适用于initialize
和package
生命周期阶段; -
maven-qiniu-plugin
:用于将构建的文件上传到七牛云存储的插件,适用于deploy
生命周期阶段; -
maven-oss-plugin
:由阿里云提供,用于将构建的文件上传到阿里云 OSS(对象存储服务)。适用于deploy
生命周期阶段。
这些插件主要是为了解决国内开发者在实际项目中遇到的特定问题或需求。它们通常集成了国内常用的工具和服务,如阿里云、七牛云、Nacos、Dubbo 等。通过使用这些插件,开发者可以更方便地进行项目的构建、部署和运维管理。
如果你正在使用这些插件,建议查看它们的官方文档和社区支持,以获取最新的信息和最佳实践。同时,也可以通过 Maven Central Repository 或者各大开源平台(如 GitHub、Gitee)获取这些插件的最新版本。
5.2、国外企业比较著名的非官方插件
国外许多企业和社区开发了许多非官方的 Maven 插件,用于解决特定的构建和部署需求。以下是一些著名的非官方插件:
-
Netflix
-
nebula-release-plugin
:用于管理项目的版本发布,适用于release
生命周期阶段。 -
nebula-dependency-lock-plugin
:用于生成和维护项目依赖的锁定文件,适用于validate
生命周期阶段。
-
-
Red Hat
-
jboss-as-maven-plugin
:用于在 JBoss 应用服务器上进行部署和管理,主要插件目标deploy
和undeploy
适用于deploy
生命周期阶段。 -
wildfly-maven-plugin
:用于在 WildFly 应用服务器上进行部署和管理,主要插件目标deploy
和undeploy
适用于deploy
生命周期阶段。
-
-
Atlassian
amps-maven-plugin
:用于构建 Atlassian 插件,如 JIRA 和 Confluence 插件,主要插件目标run
和debug
适用于integration-test
生命周期阶段。
-
Spring
spring-boot-maven-plugin
:用于构建和运行 Spring Boot 应用,主要插件目标repackage
和run
适用于package
和verify
生命周期阶段。
-
Google
google-cloud-tools-maven-plugin
:用于在 Google Cloud Platform 上进行部署和管理,主要插件目标deploy
和stop
适用于deploy
生命周期阶段。
6、自定义插件
Maven 通过插件机制扩展其功能,允许用户根据项目需求编写自定义插件。自定义插件可以实现项目构建过程中的特定任务,如代码生成、文件操作等。
6.1、常见依赖和工具
6.1.1、Maven Plugin Tools Annotations
Maven Plugin Tools Annotations:提供了一组注解,用于简化 Maven 插件的开发。
主要依赖:
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.6.0</version>
<scope>provided</scope>
</dependency>
6.1.2、Maven Plugin Plugin
Maven Plugin Plugin:用于生成插件描述符(plugin descriptor)和帮助文档(help documentation)。
主要依赖:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<goalPrefix>myplugin</goalPrefix>
</configuration>
<executions>
<execution>
<goals>
<goal>descriptor</goal>
</goals>
</execution>
</executions>
</plugin>
6.1.3、Maven Core API
Maven Core API:提供了用于与 Maven 内核进行交互的 API。
主要依赖通常已经包含在 Maven 的类路径中,不需要显式添加。
6.2、自定义插件实践
以下是一个完整的示例,展示了如何从零开始编写一个简单的 Maven 自定义插件。
6.2.1、创建 Maven 项目
首先,创建一个新的 Maven 项目用于编写插件:
mvn archetype:generate -DgroupId=com.example -DartifactId=my-maven-plugin -DarchetypeArtifactId=maven-archetype-plugin -DinteractiveMode=false
6.2.2、配置 POM 文件
在 pom.xml
中,添加插件的元数据和依赖:
<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.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>my-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>maven-plugin</packaging>
<name>My Maven Plugin</name>
<description>A custom Maven plugin example</description>
<dependencies>
<dependency>
<groupId>org.apache.maven.plugin-tools</groupId>
<artifactId>maven-plugin-annotations</artifactId>
<version>3.6.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-plugin-plugin</artifactId>
<version>3.6.0</version>
<configuration>
<goalPrefix>myplugin</goalPrefix>
</configuration>
<executions>
<execution>
<goals>
<goal>descriptor</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
6.2.3、编写 Mojo 类
在 src/main/java/com/example
目录下创建一个新的 Java 类,例如 MyMojo.java
,并使用 @Mojo
注解定义插件目标:
package com.example;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.LifecyclePhase;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
@Mojo(name = "sayhello", defaultPhase = LifecyclePhase.PROCESS_SOURCES)
public class MyMojo extends AbstractMojo {
@Parameter(property = "message", defaultValue = "Hello, Maven!")
private String message;
public void execute() throws MojoExecutionException {
getLog().info(message);
}
}
在这个例子中,我们定义了一个名为 sayhello
的插件目标,它将在 process-sources
生命周期阶段执行,并输出一条日志信息。
6.2.4、编译和安装插件
编译并安装插件到本地 Maven 仓库:
mvn clean install
6.2.5、使用自定义插件
在其他 Maven 项目中使用自定义插件。在项目的 pom.xml
中添加插件依赖:
<build>
<plugins>
<plugin>
<groupId>com.example</groupId>
<artifactId>my-maven-plugin</artifactId>
<version>1.0-SNAPSHOT</version>
<executions>
<execution>
<goals>
<goal>sayhello</goal>
</goals>
</execution>
</executions>
<configuration>
<message>Hello, Custom Maven Plugin!</message>
</configuration>
</plugin>
</plugins>
</build>
运行 Maven 构建命令:
mvn process-sources
你将看到插件输出的日志信息。