一、概述
有一个需求,就是动态地增加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项目代码:

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插件;
三、使用插件动态添加依赖
3.1 在其他项目中使用my-maven-plugin插件
我使用了自己的一个maven项目-mydemo
在mydemo项目的pom.xml中使用my-maven-plugin插件:

圈中的就是在项目中使用my-maven-plugin插件的要素;
3.2 项目打包,依赖以及被包含
idea直接package

然后在输出框里,可以看到自定义插件的日志打印:

说明自定义插件已经在 maven的校验阶段已经执行,
再看一下mydemo项目的pom.xml文件,增加了新的依赖:

最后也可以验证打的包里面已经包含了新的依赖;
四、结语
此文章只是大体的提供了一种方法,来动态地修改pom.xml文件,插件本身还可以接受参数,此文中很多写死的东西,都可以通过参数来动态变化,比如想一次增加多个依赖,那么你的参数可以是json文件,json文件包含多个依赖描述。
我的网站 www.lookhot.cn
有私活可以CSDN私信我
本文介绍了如何创建一个自定义的Maven插件来动态添加依赖到pom.xml文件中。通过新建一个Maven项目,实现修改pom.xml的功能,利用DOM4J库解析和操作XML。插件执行时会查找并添加指定的依赖。文章还展示了插件的使用方法和效果。
3296

被折叠的 条评论
为什么被折叠?



