自定义Maven插件实现修改pom.xml动态增加依赖

一、概述

有一个需求,就是动态地增加maven的依赖,接到这个需求后,一直处于懵逼的状态,一直在maven的插件库里面徘徊,最后无奈,只能自开发maven插件。

二、创建maven插件

2.1 新建maven项目

新建一个maven项目,此项目用来实现修改pom.xml动态增加依赖的功能。
下面给出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.0modelVersion>

    <groupId>com.my.mavengroupId>
    <artifactId>my-maven-pluginartifactId>
    <version>1.0-SNAPSHOTversion>
    <packaging>maven-pluginpackaging>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>

    <dependencies>
        
        <dependency>
            <groupId>org.apache.mavengroupId>
            <artifactId>maven-plugin-apiartifactId>
            <version>3.5.2version>
        dependency>
        
        <dependency>
            <groupId>org.apache.maven.plugin-toolsgroupId>
            <artifactId>maven-plugin-annotationsartifactId>
            <version>3.5.2version>
        dependency>
        <dependency>
            <groupId>org.apache.mavengroupId>
            <artifactId>maven-modelartifactId>
            <version>3.5.2version>
        dependency>

        
        <dependency>
            <groupId>org.dom4jgroupId>
            <artifactId>dom4jartifactId>
            <version>2.1.4version>
        dependency>

    dependencies>

project>

maven项目代码:
自定义Maven插件实现修改pom.xml动态增加依赖_第1张图片

AutoDependencyPlugin.java源码

package com.my.maven;

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Component;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.dom4j.DocumentException;

import java.io.IOException;

/**
 * @author xch
 * 2023/3/30 16:33
 */
@Mojo(name = "autoDependencyPlugin") //插件目标名称
public class AutoDependencyPlugin extends AbstractMojo {

    @Parameter(property = "timer.username" ,defaultValue = "moutory")
    private String userName;

    @Override
    public void execute() throws MojoExecutionException, MojoFailureException {
        getLog().info("---> Begin AutoDependencyPlugin <---");

        try {
            PomDependency.addDependency();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            getLog().error("AutoDependencyPlugin error " + e.getMessage());
            e.printStackTrace();
        }
        
        getLog().info("---> End AutoDependencyPlugin <---");
    }
}

PomDependency.java源码:

具体的功能就是拿到需要添加依赖的项目的pom.xml,然后解析xml,在节点添加新的依赖,代码只是添加新依赖,其实增删改查都是可以的。

package com.my.maven;

import org.dom4j.*;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Iterator;

/**
 * @author xch
 * 2023/3/29 11:03
 */
public class PomDependency {
    public static void addDependency() throws IOException, DocumentException {
        SAXReader reader = new SAXReader();
        File file = new File("D:\\idea_workspace\\mystudy\\mydemo\\pom.xml");
        Document document = reader.read(file);

        Element rootElement = document.getRootElement();
        Iterator<Element> iterator = rootElement.elementIterator();
        while(iterator.hasNext()) {
            Element next = iterator.next();
            Namespace namespace = next.getNamespace();
            String name = next.getQName().getName();
            if (name.equals("dependencies")) {
                System.out.println(name);
                Element dependency = getDependency(namespace);
                next.add(dependency);
            }
        }
        XMLWriter writer = new XMLWriter(new FileOutputStream(file));
        writer.write(document);
        writer.close();
    }
    
    public static Element getDependency(Namespace namespace) {
        Element dependency = DocumentHelper.createElement(QName.get("dependency", namespace));
        Element groupId = DocumentHelper.createElement(QName.get("groupId", dependency.getNamespace()));
        Element artifactId =DocumentHelper.createElement(QName.get("artifactId", dependency.getNamespace()));
        Element version = DocumentHelper.createElement(QName.get("version", dependency.getNamespace()));
        groupId.addText("com.alibaba.fastjson2");
        artifactId.addText("fastjson2");
        version.addText("2.0.25");
        dependency.add(groupId);
        dependency.add(artifactId);
        dependency.add(version);
        return dependency;
    }
}

2.2 把my-maven-plugin插件项目安装到本地

idea直接使用自定义Maven插件实现修改pom.xml动态增加依赖_第2张图片
即可。

安装本地成功后即可在,需要增加依赖的项目中使用这个maven插件;

三、使用插件动态添加依赖

3.1 在其他项目中使用my-maven-plugin插件

我使用了自己的一个maven项目-mydemo
在mydemo项目的pom.xml中使用my-maven-plugin插件:
自定义Maven插件实现修改pom.xml动态增加依赖_第3张图片
圈中的就是在项目中使用my-maven-plugin插件的要素;

3.2 项目打包,依赖以及被包含

idea直接package
自定义Maven插件实现修改pom.xml动态增加依赖_第4张图片
然后在输出框里,可以看到自定义插件的日志打印:
自定义Maven插件实现修改pom.xml动态增加依赖_第5张图片
说明自定义插件已经在 maven的校验阶段已经执行,
再看一下mydemo项目的pom.xml文件,增加了新的依赖:
在这里插入图片描述
最后也可以验证打的包里面已经包含了新的依赖;

四、结语

此文章只是大体的提供了一种方法,来动态地修改pom.xml文件,插件本身还可以接受参数,此文中很多写死的东西,都可以通过参数来动态变化,比如想一次增加多个依赖,那么你的参数可以是json文件,json文件包含多个依赖描述。

我的网站 www.lookhot.cn
有私活可以CSDN私信我

你可能感兴趣的:(Java工具,maven,java,动态增加依赖,maven插件动态修改pom,自定义Maven插件)