Maven 插件列表详解

Maven 是一个强大的项目管理和构建工具,广泛应用于 Java 项目中。作为一款优秀的构建管理工具,Maven 不仅提供了标准化的项目结构和依赖管理,还通过其丰富的插件系统,极大地扩展了其功能和灵活性。无论是代码编译、测试、打包,还是部署、报告生成,Maven 插件都扮演着不可或缺的角色。

本文将深入探讨 Maven 的插件体系,详细介绍各类插件的用途、主要目标和适用的生命周期阶段。内容涵盖了 Maven 官方插件、被淘汰的插件、社区驱动的 MojoHaus 插件、国内外企业开发的非官方插件以及如何自定义插件。希望通过这篇文章,读者能更全面地了解 Maven 插件的使用和选择,为项目构建和管理提供更强有力的支持。


文章目录

      • 1、Maven 框架本质
      • 2、Maven 官方插件
        • 2.1、核心插件
        • 2.2、打包类型(工具)
        • 2.3、报告插件
        • 2.4、工具插件
      • 3、Retired(淘汰)类型插件
      • 4、MojoHaus 插件
      • 5、其他著名非官方 Maven 插件
        • 5.1、国内著名非官方插件
        • 5.2、国外企业比较著名的非官方插件
      • 6、自定义插件
        • 6.1、常见依赖和工具
          • 6.1.1、Maven Plugin Tools Annotations
          • 6.1.2、Maven Plugin Plugin
          • 6.1.3、Maven Core API
        • 6.2、自定义插件实践
          • 6.2.1、创建 Maven 项目
          • 6.2.2、配置 POM 文件
          • 6.2.3、编写 Mojo 类
          • 6.2.4、编译和安装插件
          • 6.2.5、使用自定义插件


1、Maven 框架本质

Maven 本质上是一个插件框架,其核心并不直接执行具体的构建任务,而是将这些任务交由插件完成。比如,编译源代码的任务由 maven-compiler-plugin 插件完成。具体而言,每个任务对应一个插件目标(goal),每个插件可能包含一个或多个目标。例如,maven-compiler-plugin 插件的 compile 目标用于编译位于 src/main/java/ 目录下的主源码,而 testCompile 目标用于编译位于 src/test/java/ 目录下的测试源码。

用户可以通过两种方式调用 Maven 插件目标。第一种方式是将插件目标与生命周期阶段(lifecycle phase)绑定,这样用户只需在命令行中输入生命周期阶段即可。例如,Maven 默认将 maven-compiler-plugincompile 目标与 compile 生命周期阶段绑定,因此,执行命令 mvn compile 实际上是先定位到 compile 生命周期阶段,然后根据绑定关系调用 maven-compiler-plugincompile 目标。第二种方式是直接在命令行中指定要执行的插件目标,例如 mvn archetype:generate,表示调用 maven-archetype-plugingenerate 目标,这种带冒号的调用方式与生命周期无关。

了解 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 中显式导入就可以使用。核心插件包括一系列用于编译、测试、打包、安装、部署等构建任务的插件

image-20240618095636435

Maven 官方的核心插件共有 9 种:

  • maven-clean-plugin:用于清除项目目录中的垃圾文件和临时文件。主要插件目标 clean:clean 适用于 clean 生命周期阶段;
  • maven-resources-plugin:用于处理项目中的资源文件(复制和过滤资源文件)。主要插件目标 resources:resourcesresources:testResources 适用于 process-resourcesprocess-test-resources 生命周期阶段;
  • maven-compiler-plugin:用于编译项目中的源代码。主要插件目标 compiler:compilecompiler:testCompile 适用于 compiletest-compile 生命周期阶段;
  • maven-surefire-plugin:用于运行项目中的单元测试。主要插件目标 surefire:test 适用于 test 生命周期阶段;
  • maven-failsafe-plugin:用于运行集成测试。主要插件目标 failsafe:integration-testfailsafe:verify 适用于 integration-testverify 生命周期阶段;
  • maven-install-plugin:用于将项目的包安装到本地仓库。主要插件目标 install:install 适用于 install 生命周期阶段;
  • maven-deploy-plugin:用于将项目的包部署到远程仓库。主要插件目标 deploy:deploy 适用于 deploy 生命周期阶段;
  • maven-site-plugin:用于生成项目的站点文档。主要插件目标 site:sitesite:site-deploy 适用于 sitesite-deploy 生命周期阶段;
  • maven-verifier-plugin:用于运行验证任务。主要插件目标 verifier:verify 适用于 verify 生命周期阶段。
2.2、打包类型(工具)

Maven 提供了多种打包插件,用于不同类型的项目和构建需求。

image-20240618102154685

以下是常见的 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 提供了多种报告插件,用于生成项目的各种报告。

image-20240618102625321

以下是常见的 12 种报告插件:

  • maven-changelog-plugin:用于生成项目的变更日志报告。主要插件目标 changelog:changelog 适用于 site 生命周期阶段;
  • maven-changes-plugin:用于生成项目的变更报告和发行说明。主要插件目标 changes:changeschanges: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:javadocjavadoc: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:pmdpmd: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:reportsurefire-report:report-only 适用于 site 生命周期阶段。
2.4、工具插件

Maven 提供了多种工具插件,用于不同的构建和管理任务。

image-20240618103147070

以下是常见的工具插件:

  • maven-antrun-plugin:用于在 Maven 构建中执行 Ant 任务。主要插件目标 antrun:run 适用于 compile 生命周期阶段;

  • maven-artifact-plugin:用于管理和操作构建工件。主要插件目标 artifact:resolveartifact:resolve-transitively 适用于 compile 生命周期阶段;

  • maven-archetype-plugin:用于创建 Maven 项目模板(archetypes)。主要插件目标 archetype:generate 适用于 generate-sources 生命周期阶段;

  • maven-assembly-plugin:用于创建包含项目及其依赖项的组装包。主要插件目标 assembly:single 适用于 package 生命周期阶段;

  • maven-dependency-plugin:用于处理项目依赖,包括解析、分析和报告依赖信息。主要插件目标 dependency:copydependency:resolve 适用于 compile 生命周期阶段;

  • maven-enforcer-plugin:用于执行构建时的规则和策略。主要插件目标 enforcer:enforce 适用于 validate 生命周期阶段;

  • maven-gpg-plugin:用于对工件进行签名和验证。主要插件目标 gpg:signgpg:sign-and-deploy-file 适用于 verifydeploy 生命周期阶段;

  • maven-help-plugin:用于提供关于 Maven 项目的帮助信息。主要插件目标 help:describehelp:effective-pom 适用于 validate 生命周期阶段;

  • maven-invoker-plugin:用于执行 Maven 构建的集成测试。主要插件目标 invoker:installinvoker:run 适用于 integration-test 生命周期阶段;

  • maven-jarsigner-plugin:用于对 JAR 文件进行签名和验证。主要插件目标 jarsigner:signjarsigner: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:descriptorplugin:report 适用于 compile 生命周期阶段;

  • maven-release-plugin:用于管理 Maven 项目的版本发布。主要插件目标 release:preparerelease:perform 适用于 deploy 生命周期阶段;

  • maven-remote-resources-plugin:用于共享和同步资源。主要插件目标 remote-resources:process 适用于 generate-resources 生命周期阶段;

  • maven-scm-plugin:用于与源代码管理系统进行交互。主要插件目标 scm:checkinscm:checkout 适用于 validate 生命周期阶段;

  • maven-scm-publish-plugin:用于将生成的站点发布到 SCM 仓库。主要插件目标 scm-publish:publish-scm 适用于 site-deploy 生命周期阶段;

  • maven-scripting-plugin:用于在 Maven 构建中执行脚本。主要插件目标 scripting:script 适用于 compile 生命周期阶段;

  • maven-stage-plugin:用于管理项目的分阶段部署。主要插件目标 stage:copystage:move 适用于 deploy 生命周期阶段;

  • maven-toolchains-plugin:用于配置和管理构建工具链。主要插件目标 toolchains:toolchain 适用于 initialize 生命周期阶段;

  • maven-wrapper-plugin:用于在项目中使用 Maven Wrapper。主要插件目标 wrapper:wrapper 适用于 generate-resources 生命周期阶段。


3、Retired(淘汰)类型插件

Maven 的 Retired 类型插件是指那些已经被官方弃用或不再维护的插件。这些插件可能被更强大或更现代的插件所取代,或者其功能已经被集成到其他插件或 Maven 核心中。

image-20240618104217984

以下是一些常见的 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-pluginmaven-war-plugin 等);
  • maven-reactor-plugin:用于管理多模块项目的构建顺序。主要插件目标 reactor:make 适用于 none(手动执行)。功能已被集成到 Maven 核心中;
  • maven-repository-plugin:用于管理本地和远程 Maven 仓库。主要插件目标 repository:bundle-createrepository:bundle-install 适用于 installdeploy 生命周期阶段。功能已被更现代的仓库管理工具取代;

这些插件已经被官方标记为弃用,不再推荐使用。在迁移到新的插件或工具时,用户应查阅最新的 Maven 文档和指南,以确保构建过程的兼容性和稳定性。


4、MojoHaus 插件

Codehaus Mojo 是一个开源项目,最初托管在 Codehaus 平台上。Codehaus 是一个支持开源项目的社区和平台,提供了许多有用的 Java 工具和项目。Codehaus Mojo 专注于创建和维护 Maven 插件,这些插件被广泛使用于 Maven 构建过程中。

后来 Codehaus Mojo 关闭,MojoHaus 是 Codehaus Mojo 的继任者,负责继续维护和发展这些 Maven 插件。MojoHaus 是一个社区驱动的项目,旨在提供一个托管和协作的环境,以确保这些插件能够持续更新和维护。MojoHaus 承接了 Codehaus Mojo 的大部分插件,并继续开发新的插件。

image-20240618105008811

以下是一些常见的 MojoHaus 插件及其主要目标和生命周期阶段:

  • animal-sniffer-maven-plugin:用于检查代码是否使用了特定 JDK 版本中的 API。主要插件目标 check 适用于 verify 生命周期阶段;
  • build-helper-maven-plugin:提供各种构建辅助功能,如添加源目录、创建时间戳等。主要插件目标 add-sourceadd-test-sourcetimestamp-propertyparse-version 适用于 generate-sourcesinitialize 生命周期阶段;
  • buildplan-maven-plugin:用于生成构建计划报告。主要插件目标 listshow 适用于 none(手动执行);
  • castor-maven-plugin:用于将 XML 文件绑定到 Java 对象,或将 Java 对象转换为 XML。主要插件目标 generate 适用于 generate-sources 生命周期阶段;
  • clirr-maven-plugin:用于检查 Java 类库的二进制兼容性。主要插件目标 check 适用于 verify 生命周期阶段;
  • javacc-maven-plugin:用于生成 JavaCC(Java Compiler Compiler)解析器代码。主要插件目标 javaccjjtree 适用于 generate-sources 生命周期阶段;
  • jdepend-maven-plugin:用于生成项目的依赖性报告。主要插件目标 generate 适用于 site 生命周期阶段;
  • naar-maven-plugin:用于处理 NAAR(Nexus Artifact Archive)格式。主要插件目标 archiveextract 适用于 packageverify 生命周期阶段;
  • native-maven-plugin:用于编译和链接本地代码(如 C/C++)。主要插件目标 compilelink 适用于 compile 生命周期阶段;
  • sql-maven-plugin:用于执行 SQL 脚本。主要插件目标 execute 适用于 initialize 生命周期阶段;
  • taglist-maven-plugin:用于生成源代码中的标签列表报告(如 TODO、FIXME)。主要插件目标 taglist 适用于 site 生命周期阶段;
  • versions-maven-plugin:用于检查和更新项目依赖版本。主要插件目标 display-dependency-updatesuse-latest-versions 适用于 validate 生命周期阶段。

5、其他著名非官方 Maven 插件

5.1、国内著名非官方插件

在国内,虽然 Maven 的官方插件和一些国际知名的社区插件(如 MojoHaus)被广泛使用,但也有一些国内开发者和社区贡献的非官方插件。这些插件通常针对本地需求和特定应用场景进行了优化。以下是一些在国内比较著名的非官方 Maven 插件:

  • maven-alibaba-plugin:由阿里巴巴提供的插件,通常用于阿里巴巴内部项目构建和部署。这个插件集合包含了多个针对大规模分布式系统和微服务架构的工具;

  • maven-dubbo-plugin:用于 Dubbo 项目的插件,可以帮助开发者进行 Dubbo 服务的启动、停止、发布等操作。适用于 packageinstall 生命周期阶段;

  • maven-jpom-plugin:JPOM 是国内开源的一个运维平台,这个插件用于和 JPOM 集成,支持项目的构建、部署和运维管理。适用于 deployverify 生命周期阶段;

  • maven-seata-plugin:针对 Seata 分布式事务框架的插件,帮助管理 Seata 的配置和部署。适用于 generate-resourcespackage 生命周期阶段;

  • maven-nacos-plugin:用于管理 Nacos 配置和服务注册的插件,帮助在 Maven 构建过程中进行 Nacos 相关操作。适用于 initializepackage 生命周期阶段;

  • maven-qiniu-plugin:用于将构建的文件上传到七牛云存储的插件,适用于 deploy 生命周期阶段;

  • maven-oss-plugin:由阿里云提供,用于将构建的文件上传到阿里云 OSS(对象存储服务)。适用于 deploy 生命周期阶段。

这些插件主要是为了解决国内开发者在实际项目中遇到的特定问题或需求。它们通常集成了国内常用的工具和服务,如阿里云、七牛云、Nacos、Dubbo 等。通过使用这些插件,开发者可以更方便地进行项目的构建、部署和运维管理。

如果你正在使用这些插件,建议查看它们的官方文档和社区支持,以获取最新的信息和最佳实践。同时,也可以通过 Maven Central Repository 或者各大开源平台(如 GitHub、Gitee)获取这些插件的最新版本。

5.2、国外企业比较著名的非官方插件

国外许多企业和社区开发了许多非官方的 Maven 插件,用于解决特定的构建和部署需求。以下是一些著名的非官方插件:

  1. Netflix

    • nebula-release-plugin:用于管理项目的版本发布,适用于 release 生命周期阶段。

    • nebula-dependency-lock-plugin:用于生成和维护项目依赖的锁定文件,适用于 validate 生命周期阶段。

  2. Red Hat

    • jboss-as-maven-plugin:用于在 JBoss 应用服务器上进行部署和管理,主要插件目标 deployundeploy 适用于 deploy 生命周期阶段。

    • wildfly-maven-plugin:用于在 WildFly 应用服务器上进行部署和管理,主要插件目标 deployundeploy 适用于 deploy 生命周期阶段。

  3. Atlassian

    • amps-maven-plugin:用于构建 Atlassian 插件,如 JIRA 和 Confluence 插件,主要插件目标 rundebug 适用于 integration-test 生命周期阶段。
  4. Spring

    • spring-boot-maven-plugin:用于构建和运行 Spring Boot 应用,主要插件目标 repackagerun 适用于 packageverify 生命周期阶段。
  5. Google

    • google-cloud-tools-maven-plugin:用于在 Google Cloud Platform 上进行部署和管理,主要插件目标 deploystop 适用于 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

你将看到插件输出的日志信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/722463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

小程序分页新写法

// pages/query/query.js import {request } from ../../utils/request; Page({/*** 页面的初始数据*/data: {tabClickIndex: ,page: 1,limit: 10,listData: []},/*** 生命周期函数--监听页面加载*/onLoad(options) {this.getList()},/*** 生命周期函数--监听页面初次渲染完成*…

uniapp运行到模拟器(联想模拟器)

记录一下uniapp项目运行到联想模拟器的流程 先配置一下模拟器端口 填写对应的adb路径&#xff0c;也就是模拟器安装路径下的adb.exe的路径 然后打开模拟器的设置&#xff0c;搜索版本找到版本号&#xff0c;多次点击打开开发者模式 进入开发者选项&#xff0c;打开USB调试 …

QT 中QcomboBox控件的详细用法

在Qt中&#xff0c;QComboBox 是一个用于选择下拉列表中的项目的控件。它继承自 QWidget 并提供了许多成员函数来操作和管理这个下拉列表。以下是一些常用的 QComboBox 成员函数及其基本用法&#xff1a; 构造函数 QComboBox(QWidget *parent nullptr): 创建一个新的 QCombo…

职业探索-性能测试01-性能工程师成长路径-性能测试的核心概念-性能测试的全周期概览

职业探索-性能测试01-性能工程师成长路径-性能测试的核心概念-性能测试的全周期概览 参考来源 极客时间专栏&#xff1a;高楼的性能测试实战30讲 课程链接&#xff1a;https://time.geekbang.org/column/intro/100042501 性能测试分析的能力阶梯视图 性能工程师 真正的性能…

FuTalk设计周刊-Vol.034

&#x1f525;AI漫谈 热点捕手 1、反转反转再反转&#xff01;OpenAI“内斗”风波始末 故事还远远没有结束&#xff0c;一场“宫斗”解决不了商业世界影响下科技发展的路线之争&#xff0c;或许未来还将有很多“选择”将困扰这家年轻的企业&#xff0c;这是AI领域发展下必将经…

【论文阅读】-- 时间空间化:用于深度分类器训练的可扩展且可靠的时间旅行可视化

Temporality Spatialization: A Scalable and Faithful Time-Travelling Visualization for Deep Classifier Training 摘要1 引言2 动机3 问题定义4 方法论4.1 时空复合体4.2 复数约简 5 实验6 相关工作7 结论参考文献 摘要 时间旅行可视化回答了深度分类器的预测是如何在训练…

【单片机毕业设计选题24015】-基于物联网的家用智能充电桩计费系统设计

系统功能: 采用STM32最小系统板控制 1. 通过IM1281B电能计量模块读取系统电压电流功率电能等信息 2. 通过ESP8266WiFi模块连接阿里云 3. 使用RFID模块刷卡 4. 继电器模块控制充电 5. 12864OLED模块显示系统信息 6. 开启充电但检测不到系统电压时蜂鸣器模块报警。 主要功…

delphi 开发app

好的工具用起来就会顺手&#xff0c;很多Delphi从业者用惯了Delphi工具&#xff0c;在面对移动APP称王的时代似乎有力使不出。现在不用再担心JAVA语言的一些特性&#xff0c;太纠结了。我们直接用Delphi XE7开发吧。虽然Delphi XE2开始就支持移动开发了&#xff0c;但这中间的五…

ubuntu永久换镜像源详细方法

1.查看ubuntu的版本&#xff0c;不同的版本对应的不同的镜像源&#xff08;下面会讲到&#xff0c;先按步骤操作即可&#xff09; cat /etc/issue 2.先备份一个&#xff0c;防止更改错误 cp /etc/apt/sources.list /etc/apt/sources.list.backup 3.备份好之后删除原有的sour…

VUE 项目用 Docker+Nginx进行打包部署

一、Docker Docker 是一个容器化平台&#xff0c;允许你将应用程序及其依赖项打包在容器中。使用 Docker&#xff0c;你可以创建一个包含 Vue.js 应用程序的容器镜像&#xff0c;并在任何支持 Docker 的环境中运行该镜像。 二、Nginx Nginx 是一个高性能的 HTTP 服务器和反向…

能提醒我重要工作事项的软件是什么 工作提醒软件

在工作中&#xff0c;我们总是不可避免地需要处理各种琐碎而重要的事项。然而&#xff0c;人的记忆力毕竟有限&#xff0c;尤其是在忙碌和高压的工作环境下&#xff0c;遗忘似乎成了一个难以避免的问题。想象一下&#xff0c;你因为一个疏忽忘记了一个重要的会议&#xff0c;或…

UE4_材质_雨滴涟漪效果ripple effect_ben教程

学习笔记&#xff0c;不喜勿喷&#xff01;侵权立删&#xff0c;祝愿生活越来越好&#xff01; 雨水落下时会产生这些非常漂亮的同心环波纹&#xff0c;我们要做的第一件事是创建一个单个的圆环遮罩动画&#xff0c;我们希望环在开始的时候在中心很小&#xff0c;然后放大&…

【漏洞复现】海康威视 综合安防管理平台软件 center_api_files 任意文件上传漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

AI大模型的战场:通用大模型VS垂直大模型,谁会赢?

人不走空 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌赋&#xff1a;斯是陋室&#xff0c;惟吾德馨 目录 &#x1f308;个人主页&#xff1a;人不走空 &#x1f496;系列专栏&#xff1a;算法专题 ⏰诗词歌…

C语言 | Leetcode C语言题解之第162题寻找峰值

题目&#xff1a; 题解&#xff1a; int findPeakElement(int* nums, int numsSize) {int ls_max0;for(int i1;i<numsSize;i){if(nums[ls_max]>nums[i]);else{ls_maxi;}}return ls_max; }

部署LVS-NAT群集

目录 LVS-NAT模式部署 ​1.准备工具 2.所有虚拟机初始化 3.配置NFS共享存储&#xff08;20.0.0.40&#xff09; 3.1安装软件包 3.2创建共享目录和测试文件 4.web服务器部署&#xff08;20.0.0.20 20.0.0.30配置相同&#xff09; 4.1yum安装nginx服务 4.2测试nfs共享服…

上海科技博物馆超薄OLED柔性壁纸屏应用方案

产品&#xff1a;2组55寸OLED柔性屏2x1 特点&#xff1a;嵌入墙体&#xff0c;与空间装饰融入一体 用途&#xff1a;播放文物展示 一、项目背景 上海科技博物馆作为展示科技与文化的交汇点&#xff0c;一直致力于为观众提供沉浸式的参观体验。为了提升文物展示的现代化和科技感…

计算机网络:运输层 - 概述

计算机网络&#xff1a;运输层 - 概述 运输层的任务端口号复用与分用UDP协议首部格式 TCP协议面向字节流 运输层的任务 物理层、数据链路层以及网络层&#xff0c;他们共同解决了将主机通过网络互联起来所面临的问题&#xff0c;实现了主机到主机的通信。 网络层的作用范围是…

RIP路由协议汇总、版本兼容、定时器、协议优先级配置(华为)

#交换设备 RIP路由协议汇总 一、原理概述 当网络中路由器的路由条目非常多时&#xff0c;可以通过路由汇总&#xff08;又称路由汇聚或路由聚合&#xff09;来减少路由条目数&#xff0c;加快路由收敛时间和增强网络稳定性。路由汇总的原理是&#xff0c;同一个自然网段内的…

python GUI开发: tkinter菜单创建,记事本和画图软件综合项目的实战演练

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…