开发Maven插件时,如何获取项目及依赖JAR中引用类的源码?
解决方案思路与实现步骤
要解决获取被引用类B源码的问题,核心是先确定类B的全限定类名,再根据其所在位置(当前项目内/Maven依赖)分别处理:
1. 提取类B的全限定类名
首先得从类A的源码里精准拿到类B的全限定名,不能只依赖简单类名。可以用成熟的Java源码解析工具:
- 用JavaParser:解析类A的抽象语法树(AST),遍历import语句、类引用节点,处理同包类无需import的场景,提取全限定类名。
- 用Eclipse JDT AST:同样能准确解析源码中的类引用,覆盖静态导入、嵌套类等复杂场景。
2. 查找当前项目内的类B源码
如果类B属于当前项目(同目录/不同目录):
- 通过Maven插件的
MavenProject对象,获取项目的主源码目录(默认src/main/java,可通过project.getBuild().getSourceDirectory()获取),若需要处理测试类,还需获取测试源码目录。 - 根据全限定类名构建源码文件路径:把类名中的
.替换成系统路径分隔符,加上.java后缀,比如com.example.B对应${sourceDirectory}/com/example/B.java。 - 判断文件是否存在,存在则直接读取内容。
- 注意:如果项目有自定义源码目录,要遍历
project.getCompileSourceRoots()里的所有目录逐一查找。
3. 查找Maven依赖中的类B源码(依赖带sources JAR的情况)
如果类B来自Maven依赖,且该依赖有对应的sources JAR(即通过maven-source-plugin生成的xxx-sources.jar):
- 遍历当前项目的依赖列表(
project.getDependencies()),先判断类B的包路径是否属于该依赖的范围。 - 创建对应依赖的sources Artifact:用Maven的
ArtifactFactory创建带sourcesclassifier的Artifact,示例代码:Artifact sourcesArtifact = artifactFactory.createArtifactWithClassifier( artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion(), "jar", "sources" ); - 用
ArtifactResolver尝试解析这个sources Artifact,解析成功后即可拿到对应的sources JAR文件。 - 打开JAR文件,根据全限定类名定位内部的
.java文件路径,读取文件内容(可通过JarFile类直接定位或遍历查找)。
关键注意事项
- 缓存已查找过的类:避免重复查找相同类,提升插件运行效率。
- 处理特殊类:比如内部类、枚举、接口,内部类的文件名格式为
OuterClass$InnerClass.java,需匹配对应路径。 - 降级处理:如果依赖没有对应的sources JAR,无法获取源码,此时可在文档中标注“无源码可用”,仅显示类的全限定名。
内容的提问来源于stack exchange,提问作者wangbin
相关产品推荐
相关产品推荐

