Maven插件开发及Demo演示

这篇具有很好参考价值的文章主要介绍了Maven插件开发及Demo演示。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

maven不仅仅只是项目的依赖管理工具,其强大的核心来源自丰富的插件,可以说插件才是maven工具的灵魂。本篇文章将对如何自定义maven插件进行讲解,希望对大家有所帮助。

背景

讲如何开发maven插件之前,不妨先来聊一下什么是maven的插件。

我们知道,maven中主要有三大生命周期,clean,default和report,不同的生命周期中提供了一些快捷的操作命令给开发人员去进行项目的清理、编译、打包等操作。之所以我们可以通过类似于mvn clean compile等命令快速完成项目的清理和构建,实际上是因为maven在项目核心的生命周期节点上,已经设置好了默认的运行插件,我们执行命令的时候,实际上调用的就是绑定对应生命周期的插件。
maven插件本质上就是一个jar包,不同的插件里面有着不同功能的代码,当我们调用该插件的时候,其实就是通过执行jar包中的方法,去达到对应的goal,实现我们的目的。除了官网的maven插件之外,其实maven还允许我们根据实际的项目需要,自定义去开发maven插件,从而满足我们的项目构建需要。

demo演示

创建项目

  1. 打开 IntelliJ IDEA 工具,点击 “File”(文件)菜单,然后选择 “New”(新建),再选择 “Project”(项目)。
  2. 在弹出的对话框中,选择 “Maven” 选项,然后点击 “Next”(下一步)。
  3. 在 “New Project” 对话框中,输入项目的基本信息,如 “GroupId”、“ArtifactId”、“Version” 等。
  4. 在 “Project SDK” 下拉菜单中选择合适的 JDK 版本,然后点击 “Next”(下一步)。
  5. 在 “Project template” 对话框中,选择 “Maven Project”,并确保勾选 “Create from archetype”(从原型创建)。
  6. 在 “Choose archetype” 下拉菜单中,选择 “maven-archetype-mojo”。
  7. 点击 “Next”(下一步),然后输入项目的 “Name”(名称)和 “Location”(位置)。
  8. 点击 “Finish”(完成),IntelliJ IDEA 将会创建一个基本的 Maven 插件项目结构。
    Maven插件开发及Demo演示
    创建完成后项目结构如下:
    Maven插件开发及Demo演示
    这里的DescriptorGenerator是我重命名过的了,原本应该叫MyMojo

然后我们在pom文件中引入我们需要的依赖

<dependencies>
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-plugin-api</artifactId>
      <version>3.0</version>
    </dependency>
    <!--这个依赖引入了插件开发需要的相关注解-->
    <dependency>
      <groupId>org.apache.maven.plugin-tools</groupId>
      <artifactId>maven-plugin-annotations</artifactId>
      <version>3.4</version>
      <scope>provided</scope>
    </dependency>
     <!--将Maven文件解析成实体类的依赖-->
    <dependency>
      <groupId>org.apache.maven</groupId>
      <artifactId>maven-project</artifactId>
      <version>2.2.1</version>
    </dependency>
     <!--FreeMarker模板填充-->
    <dependency>
      <groupId>org.freemarker</groupId>
      <artifactId>freemarker</artifactId>
      <version>2.3.31</version>
    </dependency>
  </dependencies>

然后我们回到我们开发的主类DescriptorGenerator,类上加上@Mojo(name = “DescriptorPlugin”)注解,至此我们的项目骨架已经搭建完毕

业务介绍

我们的需求其实很简单,需要将项目根目录/descriptors下的两个文件填充pom文件中的version以及artifactId,并将生成的文件保存到target目录下,至此,代码就已经呼之欲出了:

/*
 * Copyright 2001-2005 The Apache Software Foundation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.project.MavenProject;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;

/**
 * Goal which touches a timestamp file.
 *
 * @goal touch
 * @phase process-sources
 */
@Mojo(name = "DescriptorPlugin")
public class DescriptorGenerator extends AbstractMojo {

    public void execute() throws MojoExecutionException {
        // 获取版本号及artifactId
        MavenProject project = (MavenProject) getPluginContext().get("project");
        Map<String, Object> dataModel = new HashMap<String, Object>();
        dataModel.put("version", project.getVersion());
        dataModel.put("artifactId",project.getArtifactId());
        System.out.println("Descriptor Generator Info: version : " + project.getVersion());
        System.out.println("Descriptor Generator Info: artifactId : " + project.getArtifactId());
        fillTemplate(dataModel,"DeploymentDescriptor.json");
        fillTemplate(dataModel,"ModuleDescriptor.json");
    }


    private void fillTemplate(Map<String, Object> dataModel,String fileName){
        String renderedContent = "";
        try {
            // 读取文件内容
            Configuration configuration = new Configuration(Configuration.VERSION_2_3_31);
            configuration.setDirectoryForTemplateLoading(new File("descriptors"));
            configuration.setDefaultEncoding("UTF-8");
            // 加载模板文件
            Template template = null;
            try {
                template = configuration.getTemplate(fileName);
            } catch (IOException e) {
                System.out.println("Descriptor Generator Error: File Not Found, File Path : " + "descriptors/" +fileName);
            }
            // 执行模板渲染
            StringWriter writer = new StringWriter();
            template.process(dataModel, writer);
            // 获取渲染后的内容
            renderedContent = writer.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 获取项目的 target 目录路径
        String targetDirectory = "target";
        // 创建 target 目录对象
        File targetDir = new File(targetDirectory);
        // 检查 target 目录是否存在,如果不存在则创建它
        if (!targetDir.exists()) {
            targetDir.mkdirs();
        }
        // 生成最终的文件路径
        String outputFile = targetDirectory + File.separator + fileName;
        System.out.println("Descriptor Generator Info: Output File : " + outputFile);
        FileWriter writer = null;
        try {
            writer = new FileWriter(outputFile);
            // 将处理后的文件内容写入生成的文件
            writer.write(renderedContent);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if(writer != null){
                    writer.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

}

Mojo已经给我们提供了一个AbstractMojo的抽象类,只需要继承于他,并且定义execute方法即可。

运行

接下去我们就将这个项目打包并且安装到本地仓库

mvn clean install

然后打开本地仓库,检查是否成功生成jar包
Maven插件开发及Demo演示

添加插件

我们打开我们的业务项目,在pom文件中,添加打包插件

<plugin>
    <artifactId>mod-shl-descriptor-generate</artifactId>
    <groupId>org.folio</groupId>
    <version>1.0.1</version>
    <executions>
        <execution>
            <id>test</id>
            <phase>compile</phase>
            <goals>
                <goal>DescriptorPlugin</goal>
            </goals>
        </execution>
    </executions>
</plugin>

其中DescriptorPlugin就是我们定义的@Mojo注解的值

运行

我们再业务项目中执行

mvn clean package

输出结果如下:
Maven插件开发及Demo演示
再看我们的target目录,那两个我们需要的文件也就出现在里面了

Maven插件开发及Demo演示

总结

至此,我们的maven插件就开发完毕了,可以看到整体开发难度并不是很高,但是可以实现的功能确十分强大。比如我们还可以通过定义注解的方式,打包阶段解析注解,生成我们想要的内容,或者提交到服务器完成类似于接口的注册等等功能。
学无止境,欢迎大家多多交流以及学习~文章来源地址https://www.toymoban.com/news/detail-501783.html

到了这里,关于Maven插件开发及Demo演示的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【可观察性架构】什么是可观察性? 不仅仅是日志、指标和跟踪

    随着动态系统架构的复杂性和规模的增加,IT 团队面临着越来越大的压力来跟踪和响应其多云环境中的条件和问题。因此,IT 运营、DevOps 和 SRE 团队都在寻找对这些日益多样化和复杂的计算环境的更高可观察性。 但什么是可观察性?为什么它很重要,它实际上可以帮助组织实

    2024年02月10日
    浏览(42)
  • Mac Snipaste 不仅仅是截图工具,不在菜单栏显示,怎么样修改快捷键

    官网下载: https://www.snipaste.com Snipaste 免费,支持 Windows、Mac,Windows 上的功能相当多而且,Mac 也够用了 不仅仅是个截图工具,具有强大功能: 截图 贴图(直接将截图贴在桌面上,当标签贴使用) 取色器 fn + F1: 开始截屏 C : 取色 Tab : 检测窗口 + 滑动触控板,选择要截屏的

    2024年02月08日
    浏览(31)
  • 从星巴克看:NFT不仅仅是一种数字资产,更代表着一种全新的交互模式

    品牌方不应将数字化的生意局限在NFT收藏品上,更需另辟蹊径,比如说粉丝通证。“粉丝通证与其说是一个概念,更准确的描述一种运营系统,而任何以此为基础进行的活动都是只是一种实现方式。如果发行的品牌方有强大影响力或者‘信心’,那么发售一款NFT收藏品是最简

    2024年02月11日
    浏览(42)
  • Maven第九章: Maven插件应用-FTP的插件

    前言 本章内容重点:IDEA中 FTP的插件,以及FTP的插件在IDEA中连接和操作FTP服务器 操作应用。 背景 实际开发过程中,windows 安装相应的编辑工具不方便,我们需要实时上传到Linux服务进行编辑运行,查看效果,IDEA开发工具FTP插件,能帮助我们提高效率。例如:springboot docker镜

    2024年02月06日
    浏览(27)
  • Maven(3)---Maven插件和生命周期

    在前两篇博客中,我们已经了解了Maven的基础知识、安装配置和依赖管理。本篇博客将重点介绍Maven的插件和生命周期,它们是Maven的核心特性之一。 Maven插件是用于扩展和增强Maven的功能的工具。插件可以执行各种任务,如编译、测试、打包、部署等。Maven插件基于插件目标(

    2024年02月05日
    浏览(27)
  • 【Maven三】——maven生命周期和插件

    Maven之POM介绍 maven命令上传jar包到nexus 【Maven二】——maven仓库 由于在具体项目开发过程中对于maven的理解和掌握处于基本运用的阶段,了解maven过于片面,所以本篇博客是博主学习《maven实战》书籍之后对maven生命周期和插件的总结,绝大多数内容源于《maven》实战这本书籍。

    2024年02月16日
    浏览(23)
  • maven:Maven Helper插件使用方法

     maven Helper是排查jar包冲突的一大利器,jar包冲突大部分是由于引用了同一个jar的不同版本而导致的。  maven Helper就是一个将pom.xml图形化界面的一个插件(总比看xml好理解),并且增加了查询依赖冲突,搜索等功能。所以它的入口就是在pom文件中 下面用 分析Jar包冲突 和 查

    2024年02月12日
    浏览(76)
  • Maven 入门实战(4)--dockerfile-maven 插件使用

    本文主要介绍如何通过 dockerfile-maven-plugin 插件把 Java 服务构建成 docker 镜像;文中所使用到的软件版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、dockerfile-maven-plugin 1.4.13。 使用如下命令查看插件概要信息: 该插件包含 4 个目标: 目标 说明 默认绑定阶段 dockerfi

    2024年02月16日
    浏览(32)
  • Maven的安装、配置以及在Eclipse中安装maven插件

    一、需要准备的东西 (原文链接) 1.首先确保安装了JDK,并且成功配置了JDK的环境变量。 2. 已安装Eclipse 3. Maven程序包 二、maven下载与安装 1. 前往https://maven.apache.org/download.cgi下载最新版的Maven程序: 2. 将文件解压到D:Program FilesApachemaven目录下: 3. 新建环境变量MAVEN_HOME,赋值

    2023年04月14日
    浏览(45)
  • Maven 入门实战(3)--docker-maven-plugin 插件使用

    本文主要介绍如何通过 docker-maven-plugin 插件把 Java 服务构建成 docker 镜像;文中所使用到的软件版本:Docker 20.10.17、Java 1.8.0_341、SpringBoot 2.7.12、Maven 3.8.4、docker-maven-plugin 1.2.2。 使用如下命令查看插件详细信息: 该插件包含 5 个目标: 目标 说明 docker:build 构建镜像 docker:hel

    2024年02月13日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包