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

如何在JavaParser中配置Maven类型解析器实现自动依赖解析

问题描述

我有一个由Maven管理依赖的AEM项目,目前使用JavaParser库做代码分析。之前是手动指定M2仓库中Jar包路径来注入TypeSolver,代码如下:

List<TypeSolver> typeSolvers = new ArrayList<TypeSolver>();
typeSolvers.add(new ReflectionTypeSolver());
typeSolvers.add(new JavaParserTypeSolver(new File(projectPath + "/src/main/java")));
for (String str : dependencies) {
    typeSolvers.add(JarTypeSolver.getJarTypeSolver(str));
}
TypeSolver[] tsArray = new TypeSolver[typeSolvers.size()];
for (int i = 0; i < typeSolvers.size(); i++) {
    tsArray[i] = typeSolvers.get(i);
}
typeSolver = new CombinedTypeSolver(tsArray);

手动传入Jar包路径的方式如下:

List<String> dependencies = new ArrayList<>();
dependencies.add("C:/Users/"+Utility.USER_NAME+"/.m2/repository/com/adobe/aem/uber-jar/6.2.0/uber-jar-6.2.0-apis.jar");

现在希望TypeSolver能自动解析依赖,无需手动添加路径,请问Java中是否有类似“Maven TypeSolver”的工具实现该需求?

解决方案

方案一:使用JavaParser官方Maven Symbol Solver扩展

JavaParser的Symbol Solver模块提供了专门的Maven集成工具,可直接基于项目的pom.xml自动解析所有依赖并生成TypeSolver,无需手动指定Jar路径。

步骤1:添加Maven依赖

在项目pom.xml中引入对应扩展:

<dependency>
    <groupId>com.github.javaparser</groupId>
    <artifactId>javaparser-symbol-solver-maven</artifactId>
    <version>3.25.8</version> <!-- 请使用与你的JavaParser版本匹配的版本 -->
</dependency>

步骤2:代码中使用MavenTypeSolver

替换原来手动添加Jar路径的逻辑,直接通过pom.xml构建MavenTypeSolver:

// 基于项目的pom.xml构建MavenTypeSolver
MavenTypeSolver mavenTypeSolver = MavenTypeSolver.builder()
    .withPomFile(new File(projectPath + "/pom.xml"))
    .withMavenInstallation() // 自动识别系统中的Maven环境
    .build();

// 组合所有TypeSolver
CombinedTypeSolver typeSolver = new CombinedTypeSolver();
typeSolver.add(new ReflectionTypeSolver());
typeSolver.add(new JavaParserTypeSolver(new File(projectPath + "/src/main/java")));
typeSolver.add(mavenTypeSolver);

该工具会自动解析pom.xml中的所有依赖(包括间接依赖),从本地M2仓库中定位对应的Jar包,无需手动维护路径列表。

方案二:利用Maven API自动生成依赖路径列表

如果不想引入额外依赖,可以直接使用Maven Core API解析项目依赖,生成Jar路径列表后再构建JarTypeSolver。

步骤1:添加Maven Core依赖

<dependency>
    <groupId>org.apache.maven</groupId>
    <artifactId>maven-core</artifactId>
    <version>3.8.6</version> <!-- 使用稳定版本 -->
</dependency>
<dependency>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>3.4.0</version>
</dependency>

步骤2:代码中解析依赖路径

通过Maven命令生成类路径文件,再读取路径列表:

// 调用Maven dependency:build-classpath命令生成依赖路径文件
MavenCli cli = new MavenCli();
cli.doMain(
    new String[]{"dependency:build-classpath", "-Dmdep.outputFile=classpath.txt"},
    projectPath,
    System.out,
    System.err
);

// 读取生成的classpath文件,提取所有Jar路径
List<String> dependencyPaths = Files.readAllLines(Paths.get(projectPath + "/classpath.txt"))
    .stream()
    .flatMap(line -> Arrays.stream(line.split(File.pathSeparator)))
    .filter(path -> path.endsWith(".jar"))
    .collect(Collectors.toList());

// 构建TypeSolver列表
List<TypeSolver> typeSolvers = new ArrayList<>();
typeSolvers.add(new ReflectionTypeSolver());
typeSolvers.add(new JavaParserTypeSolver(new File(projectPath + "/src/main/java")));
for (String jarPath : dependencyPaths) {
    typeSolvers.add(JarTypeSolver.getJarTypeSolver(jarPath));
}
typeSolver = new CombinedTypeSolver(typeSolvers.toArray(new TypeSolver[0]));

这种方式通过Maven自身的依赖插件生成完整的依赖类路径,再自动转换为JarTypeSolver列表,同样无需手动维护Jar路径。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:57:22