使用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

