如何基于groupId和artifactId读取多模块项目pom依赖存入List<Dependency>
实现将pom.xml依赖读取到List的方案
1. 多模块项目pom定位方案
无需写死绝对路径,可通过两种方式获取目标pom文件对象:
- 若解析本地Maven仓库中的pom,可通过已定位到的groupId、artifactId、version拼接相对路径:
System.getProperty("user.home") + "/.m2/repository/" + groupId.replace(".", "/") + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version + ".pom" - 若解析当前项目内子模块的pom,可通过类路径加载:
this.getClass().getClassLoader().getResource("子模块相对路径/pom.xml").getFile()
2. 依赖解析实现
推荐使用Maven官方API解析,避免自定义XML解析的格式兼容问题,也可选择轻量XML解析工具实现。
方案一:Maven原生API解析(推荐)
首先引入解析依赖到你的项目pom中:
<dependency> <groupId>org.apache.maven</groupId> <artifactId>maven-model</artifactId> <version>3.8.6</version> </dependency> <dependency> <groupId>org.codehaus.plexus</groupId> <artifactId>plexus-utils</artifactId> <version>3.4.2</version> </dependency>
解析代码如下,直接返回官方org.apache.maven.model.Dependency类型的列表:
import org.apache.maven.model.Dependency; import org.apache.maven.model.Model; import org.apache.maven.model.io.xpp3.MavenXpp3Reader; import java.io.File; import java.io.FileReader; import java.util.List; public class PomParser { public List<Dependency> getDependenciesFromPom(File pomFile) throws Exception { MavenXpp3Reader reader = new MavenXpp3Reader(); Model pomModel = reader.read(new FileReader(pomFile)); // 直接返回解析完成的依赖列表 return pomModel.getDependencies(); } }
如果需要转为自定义的Dependency类,按如下方式转换即可:
// 自定义Dependency示例 public class CustomDependency { private String groupId; private String artifactId; private String version; public CustomDependency(String groupId, String artifactId, String version) { this.groupId = groupId; this.artifactId = artifactId; this.version = version; } // 省略getter、setter } // 转换代码 public List<CustomDependency> getCustomDependencies(File pomFile) throws Exception { MavenXpp3Reader reader = new MavenXpp3Reader(); Model pomModel = reader.read(new FileReader(pomFile)); return pomModel.getDependencies().stream() .map(dep -> new CustomDependency(dep.getGroupId(), dep.getArtifactId(), dep.getVersion())) .toList(); }
方案二:Dom4j轻量解析(无需引入Maven依赖)
适合轻量场景使用,首先引入Dom4j依赖:
<dependency> <groupId>org.dom4j</groupId> <artifactId>dom4j</artifactId> <version>2.1.3</version> </dependency>
解析代码:
import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.io.File; import java.util.ArrayList; import java.util.List; public class LightweightPomParser { public List<CustomDependency> parsePom(File pomFile) throws Exception { List<CustomDependency> result = new ArrayList<>(); SAXReader saxReader = new SAXReader(); Document document = saxReader.read(pomFile); Element root = document.getRootElement(); Element dependenciesNode = root.element("dependencies"); if (dependenciesNode == null) { return result; } List<Element> depNodes = dependenciesNode.elements("dependency"); for (Element depNode : depNodes) { String groupId = depNode.elementTextTrim("groupId"); String artifactId = depNode.elementTextTrim("artifactId"); String version = depNode.elementTextTrim("version"); result.add(new CustomDependency(groupId, artifactId, version)); } return result; } }
3. 特殊场景补充
如果你是在开发Maven插件,无需手动解析文件,直接注入MavenProject对象,调用mavenProject.getDependencies()即可直接拿到依赖列表。
内容的提问来源于stack exchange,提问作者EvgenyMalkov
相关产品推荐
相关产品推荐

