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

使用Gradle Tooling API解析build.gradle遇类找不到问题求助

问题描述

我想解析build.gradle文件并列出其中的依赖,用了Gradle Tooling API官方提供的代码,但运行时抛出java.lang.ClassNotFoundException: org.gradle.internal.logging.progress.ProgressLoggerFactory异常。当前环境是Gradle 6.6.1,搭配slf4j-api-1.7.32、slf4j-simple-1.7.32或slf4j-nop-1.7.32,求解决方法或其他解析gradle文件的方案。

我的代码如下:

public class Main {
public static void main(String[] args) {
    // Configure the connector and create the connection
    GradleConnector connector = GradleConnector.newConnector();

    if (args.length > 0) {
        connector.useInstallation(new File(args[0]));
        if (args.length > 1) {
            connector.useGradleUserHomeDir(new File(args[1]));
        }
    }

    connector.forProjectDirectory(new File("."));

    ProjectConnection connection = connector.connect();
    try {
        // Load the Eclipse model for the project
        EclipseProject project = connection.getModel(EclipseProject.class);
        System.out.println("Project: " + project.getName());
        System.out.println("Project directory: " + project.getProjectDirectory());
        System.out.println("Source directories:");
        for (EclipseSourceDirectory srcDir : project.getSourceDirectories()) {
            System.out.println(srcDir.getPath());
        }
        System.out.println("Project classpath:");
        for (ExternalDependency externalDependency : project.getClasspath()) {
            System.out.println(externalDependency.getFile().getName());
        }
        System.out.println("Associated gradle project:");
        System.out.println(project.getGradleProject());
    } finally {
        // Clean up
        connection.close();
    }
}
}
解决方法

针对ClassNotFoundException的修复

这个异常是因为Gradle Tooling API的核心依赖缺失导致的,必须确保引入的tooling-api版本和你的Gradle安装版本(6.6.1)完全一致。

1. 调整依赖配置

如果是Maven项目,在pom.xml中添加:

<dependency>
    <groupId>org.gradle</groupId>
    <artifactId>gradle-tooling-api</artifactId>
    <version>6.6.1</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-api</artifactId>
    <version>1.7.32</version>
</dependency>
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-simple</artifactId>
    <version>1.7.32</version>
    <scope>runtime</scope>
</dependency>

如果是Gradle项目,在build.gradle中添加:

dependencies {
    implementation 'org.gradle:gradle-tooling-api:6.6.1'
    implementation 'org.slf4j:slf4j-api:1.7.32'
    runtimeOnly 'org.slf4j:slf4j-simple:1.7.32'
}

2. 排查依赖冲突

用mvn dependency:tree(Maven)或./gradlew dependencies(Gradle)查看项目依赖树,确认没有其他版本的Gradle相关依赖和tooling-api冲突,如有冲突直接排除即可。

其他解析Gradle依赖的替代方案

如果Tooling API的方式依然有问题,可以试试下面几种方案:

1. 直接调用Gradle命令行解析

在代码中执行gradle dependencies命令,捕获输出后提取依赖信息,这种方式不需要额外引入tooling-api:

Process process = new ProcessBuilder()
        .directory(new File("."))
        .command("gradle", "dependencies")
        .redirectErrorStream(true)
        .start();

BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
    // 过滤出依赖行,比如包含"---"的行
    if (line.contains("---")) {
        System.out.println(line.trim());
    }
}
process.waitFor();

2. 换用GradleProject模型替代EclipseProject

修改代码中的模型获取逻辑,GradleProject是官方更基础稳定的模型:

GradleProject project = connection.getModel(GradleProject.class);
System.out.println("Project: " + project.getName());
// 遍历项目依赖
for (Dependency dependency : project.getDependencies()) {
    System.out.println(dependency.getGroup() + ":" + dependency.getName() + ":" + dependency.getVersion());
}

3. 第三方解析库

可以尝试使用gradle-parser这类第三方库,但要注意选择支持Gradle 6.x版本的分支,不过这类库的更新速度可能不如官方方案,需要自行评估稳定性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:27:23