You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Java代码获取Spring Boot项目未显式声明的依赖版本?

解决Spring Boot项目获取完整依赖版本的Java实现方案

直接用maven-model解析POM只能拿到显式声明的版本,因为它仅读取原始XML结构,不会执行Maven的依赖解析流程——包括继承parent的dependencyManagement版本、依赖冲突调解、快照版本解析等。要实现和mvn dependency:tree相同的效果,得用Maven的核心依赖解析API或者Spring Boot专属工具类。

方法一:使用Maven Resolver API(Aether)

这是Maven官方用来处理依赖解析的底层库,能完整复刻Maven命令行的依赖解析逻辑,适用于所有Maven项目。

步骤1:添加Maven Resolver依赖

在你的项目POM里加入以下依赖(版本可根据当前Maven版本调整):

<dependencies>
    <dependency>
        <groupId>org.apache.maven.resolver</groupId>
        <artifactId>maven-resolver-api</artifactId>
        <version>1.9.15</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.resolver</groupId>
        <artifactId>maven-resolver-impl</artifactId>
        <version>1.9.15</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven.resolver</groupId>
        <artifactId>maven-resolver-transport-http</artifactId>
        <version>1.9.15</version>
    </dependency>
    <dependency>
        <groupId>org.apache.maven</groupId>
        <artifactId>maven-core</artifactId>
        <version>3.9.5</version>
    </dependency>
</dependencies>

步骤2:编写依赖解析代码

以下代码会解析指定POM的完整依赖树,包含所有继承、调解后的实际版本:

import org.apache.maven.model.building.DefaultModelBuilder;
import org.apache.maven.model.building.DefaultModelBuilderFactory;
import org.apache.maven.model.building.DefaultModelBuildingRequest;
import org.apache.maven.model.building.ModelBuildingRequest;
import org.apache.maven.model.Model;
import org.apache.maven.resolver.api.*;
import org.apache.maven.resolver.api.resolver.ResolutionResult;
import org.apache.maven.resolver.api.resolver.ResolveRequest;
import org.apache.maven.resolver.examples.util.BasicRepositorySystemFactory;

import java.io.File;
import java.util.List;

public class DependencyVersionResolver {

    public static void main(String[] args) throws Exception {
        // 1. 加载并构建完整的Maven模型(包含parent继承内容)
        File pomFile = new File("path/to/your/project/pom.xml");
        DefaultModelBuilder modelBuilder = new DefaultModelBuilderFactory().newInstance();
        ModelBuildingRequest request = new DefaultModelBuildingRequest()
                .setPomFile(pomFile)
                .setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL);
        Model model = modelBuilder.build(request).getEffectiveModel();

        // 2. 初始化Maven Resolver仓库系统
        RepositorySystem repoSystem = BasicRepositorySystemFactory.newRepositorySystem();
        RepositorySystemSession session = MavenRepositoryUtils.newSession(repoSystem);

        // 3. 设置远程仓库(这里用Maven中央仓库,可按需添加私有仓库)
        RemoteRepository central = new RemoteRepository.Builder("central", "default", "https://repo1.maven.org/maven2/").build();
        session.setRemoteRepositories(List.of(central));

        // 4. 构建依赖请求,解析项目compile范围依赖
        DependencyFilter filter = DependencyFilterUtils.classpathFilter("compile");
        List<Artifact> projectArtifacts = model.getDependencies().stream()
                .map(MavenRepositoryUtils::toArtifact)
                .toList();

        ResolveRequest resolveRequest = new ResolveRequest()
                .setSession(session)
                .setArtifacts(projectArtifacts)
                .setFilter(filter);

        // 5. 执行依赖解析
        ResolutionResult result = repoSystem.resolve(resolveRequest);

        // 6. 输出所有依赖及其实际版本
        for (Artifact artifact : result.getArtifacts()) {
            System.out.printf("%s:%s:%s%n", artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion());
        }
    }
}

方法二:利用Spring Boot的DependencyManagement工具类

如果是Spring Boot项目,可以直接用Spring Boot提供的工具类,它会自动读取spring-boot-starter-parent里的依赖管理配置,无需手动处理仓库解析。

步骤1:添加Spring Boot相关依赖

确保项目引入Spring Boot的核心依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependency-management</artifactId>
    <version>3.2.0</version>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
    <version>3.2.0</version>
</dependency>

步骤2:编写代码获取依赖版本

import org.springframework.boot.dependencymanagement.DependencyManagement;
import org.springframework.boot.dependencymanagement.DependencyManagementEntry;
import org.springframework.boot.dependencymanagement.DependencyManagementGroup;
import org.springframework.boot.dependencymanagement.buildmodel.DependencyManagementModelBuilder;
import org.springframework.boot.dependencymanagement.buildmodel.ModelBuildingRequest;

import java.io.File;
import java.util.Map;

public class SpringBootDependencyResolver {

    public static void main(String[] args) throws Exception {
        File pomFile = new File("path/to/your/project/pom.xml");
        ModelBuildingRequest request = new ModelBuildingRequest(pomFile);
        DependencyManagement dependencyManagement = DependencyManagementModelBuilder.build(request);

        // 遍历所有依赖管理条目(包括parent继承的版本)
        for (DependencyManagementGroup group : dependencyManagement.getGroups()) {
            Map<String, DependencyManagementEntry> entries = group.getEntries();
            for (Map.Entry<String, DependencyManagementEntry> entry : entries.entrySet()) {
                String artifactId = entry.getKey();
                String version = entry.getValue().getVersion();
                System.out.printf("%s:%s:%s%n", group.getGroupId(), artifactId, version);
            }
        }
    }
}

关键说明

  • maven-model仅处理静态XML,不会触发Maven的依赖解析生命周期,所以拿不到继承的版本;上述两种方法都会执行完整的依赖解析逻辑,和mvn dependency:tree的底层逻辑一致。
  • 如果项目有私有仓库,需要在代码中添加对应的RemoteRepository配置,确保能解析私有依赖。

内容的提问来源于stack exchange,提问作者Robbi Nespu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:07:31