如何在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
相关产品推荐
相关产品推荐

