痘痘飞 2024-04-08 16:05 采纳率: 50%
浏览 10
已结题

如何读取maven依赖的jar包中的代码?

我正在编写一个maven插件,它的功能是解析调用这个插件的项目里面的源码,根据某些规则生成一份文档,例如统计所有的Controller等。

现在我有一个问题,当我拿到类a的源码(包括它的注释),发现这个类a引用了另一个类b,我应该如何获取类b的源码呢?

这个b可能在同一个目录,也可能在不同的目录,甚至可能在maven依赖的jar包中。

当然依赖的jar包有可能依赖了maven-source-plugin插件,这种情况下我应该是可以获取它的源码的吧?

这种需求有什么实现方案吗?

  • 写回答

3条回答 默认 最新

  • 关注

    下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    针对你的需求,实现方案有以下几种:

    1. 扫描源码文件夹

    可以通过扫描整个源码文件夹来获取所有的编译完成的类,检查每个类的依赖关系,并递归执行相同的过程。虽然这种方法比较简单,但是非常耗时。

    1. 直接读取依赖的jar包

    通过读取maven依赖的jar包中的class文件,反射并解析其依赖的类,再通过反射读取依赖的类的源代码。这种方法比较快,但是需要解决递归读取多级依赖的问题。

    1. 通过maven依赖关系树直接读取

    使用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进行单独下载。

    参考文章:

    1. https://www.cnblogs.com/dplrliuxiaoyu/p/9335421.html

    2.https://blog.csdn.net/david0001/article/details/79551029

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 4月30日
  • 创建了问题 4月8日

悬赏问题

  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443
  • ¥20 Qt Quick Android 项目报错及显示问题
  • ¥15 而且都没有 OpenCVConfig.cmake文件我是不是需要安装opencv,如何解决?
  • ¥15 oracleBIEE analytics
  • ¥15 H.264选择性加密例程
  • ¥50 windows的SFTP服务器如何能批量同步用户信息?
  • ¥15 centos7.9升级python3.0的问题