我正在编写一个maven插件,它的功能是解析调用这个插件的项目里面的源码,根据某些规则生成一份文档,例如统计所有的Controller等。
现在我有一个问题,当我拿到类a的源码(包括它的注释),发现这个类a引用了另一个类b,我应该如何获取类b的源码呢?
这个b可能在同一个目录,也可能在不同的目录,甚至可能在maven依赖的jar包中。
当然依赖的jar包有可能依赖了maven-source-plugin插件,这种情况下我应该是可以获取它的源码的吧?
这种需求有什么实现方案吗?
我正在编写一个maven插件,它的功能是解析调用这个插件的项目里面的源码,根据某些规则生成一份文档,例如统计所有的Controller等。
现在我有一个问题,当我拿到类a的源码(包括它的注释),发现这个类a引用了另一个类b,我应该如何获取类b的源码呢?
这个b可能在同一个目录,也可能在不同的目录,甚至可能在maven依赖的jar包中。
当然依赖的jar包有可能依赖了maven-source-plugin插件,这种情况下我应该是可以获取它的源码的吧?
这种需求有什么实现方案吗?
下午好🌅🌅🌅
本答案参考ChatGPT-3.5
针对你的需求,实现方案有以下几种:
可以通过扫描整个源码文件夹来获取所有的编译完成的类,检查每个类的依赖关系,并递归执行相同的过程。虽然这种方法比较简单,但是非常耗时。
通过读取maven依赖的jar包中的class文件,反射并解析其依赖的类,再通过反射读取依赖的类的源代码。这种方法比较快,但是需要解决递归读取多级依赖的问题。
使用Maven的依赖关系树,从而准确地获取所有依赖。通过解析依赖关系树,依次读取所有依赖包的源代码。
org.apache.commons commons-lang3 3.11通过如下代码获取commons-lang3的源码路径:
String classpath = StringUtils.join(java.lang.System.getProperty("java.class.path"), File.pathSeparator);//获取当前类路径 Artifact artifact = mavenProject.getArtifactMap().getDependencyArtifacts().stream() .filter(x -> x.getArtifactId().equals("commons-lang3")).findFirst().orElse(null); File sourceFile = new File(mavenProject.getBuild().getSourceDirectory()); if (artifact != null){ String path = String.format("%s%s%s%s%s", targetPath, File.separator, "dependency", File.separator, artifact.getFile().getName()); JarFile jarFile = new JarFile(path, false, ZipFile.OPEN_READ); Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { JarEntry entry = (JarEntry) entries.nextElement(); if (!entry.isDirectory() && entry.getName().endsWith(".java")) { String content = getContent(entry, jarFile);//获取类的源码 System.out.println(content);//打印出源码 } } }
需要注意的是,有些依赖包不会附带源代码。这时候可以使用maven-source-plugin
进行单独下载。
参考文章:
2.https://blog.csdn.net/david0001/article/details/79551029