> 文章列表 > 自定义Maven插件实现修改pom.xml动态增加依赖

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

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

一、概述

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

二、创建maven插件

2.1 新建maven项目

新建一个maven项目,此项目用来实现修改pom.xml动态增加依赖的功能。
下面给出pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<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.my.maven</groupId><artifactId>my-maven-plugin</artifactId><version>1.0-SNAPSHOT</version><packaging>maven-plugin</packaging><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!-- 提供AbstractMojo抽象类、允许文档注解 --><dependency><groupId>org.apache.maven</groupId><artifactId>maven-plugin-api</artifactId><version>3.5.2</version></dependency><!-- 允许直接注解 --><dependency><groupId>org.apache.maven.plugin-tools</groupId><artifactId>maven-plugin-annotations</artifactId><version>3.5.2</version></dependency><dependency><groupId>org.apache.maven</groupId><artifactId>maven-model</artifactId><version>3.5.2</version></dependency><!-- https://mvnrepository.com/artifact/org.dom4j/dom4j --><dependency><groupId>org.dom4j</groupId><artifactId>dom4j</artifactId><version>2.1.4</version></dependency></dependencies></project>

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

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;@Overridepublic 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动态增加依赖
即可。

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

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

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

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

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

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

四、结语

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

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