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


    关注 码龄 粉丝数 原力等级 -- 被采纳 被点赞 采纳率 痘痘飞 2024-04-08 16:05 采纳率: 42.9% 浏览 3 首页/ Java / 如何读取maven依赖的jar包中的代码? maven 我正在编写一个maven插件,它的功能是解析调用这个插件的项目里面的源码,根据某些规则生成一份文档,例如统计所有的Controller等。 现在我有一个问题,当我拿到类a的源码(包括它的注释),发现这个类a引用了另一个类b,我应该如何获取类b的源码呢? 这个b可能在同一个目录,也可能在不同的目录,甚至可能在maven依赖的jar包中。 当然依赖的jar包有可能依赖了maven-source-plugin插件,这种情况下我应该是可以获取它的源码的吧? 这种需求有什么实现方案吗? 收起 写回答 好问题 0 提建议 追加酬金 关注问题 微信扫一扫 点击复制链接 分享 邀请回答 编辑 收藏 删除 结题 收藏 举报 追加酬金 (90%的用户在追加酬金后获得了解决方案) 当前问题酬金 ¥ 0 (可追加 ¥500) ¥ 15¥ 20¥ 50¥ 100¥ 200 支付方式 扫码支付 二维码出错 点击刷新 支付金额 15 元 提供问题酬金的用户不参与问题酬金结算和分配 支付即为同意 《付费问题酬金结算规则》 结题 再想想 删除 再等等

    3条回答 默认 最新

    • Kwan的解忧杂货铺 Java领域优质创作者 2024-04-08 16:06
      关注

      下午好🌅🌅🌅
      本答案参考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

      评论 编辑记录
    • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-08 16:05
      关注

      引自免费微信小程序:皆我百晓生

      首先,你需要确保你已经正确地构建并发布了你的maven项目,并且该项目依赖了你需要从类a中获取源码所需的jar包。

      如果你已经成功地从类a中获取到了源码,并将其添加到maven项目中,那么接下来你需要知道如何从b的源码中提取你需要的信息。

      在Java中,你可以使用java.lang.reflect包中的ClassMethod类来获取类的方法。但是,这需要你了解类的方法签名以及其参数类型和返回值类型。因此,如果你对类b没有足够的了解,那么你可能需要借助第三方库,如jgit,来查找类b的来源。

      如果你不想直接使用第三方库,那么你可以在类a中获取类b的元数据(如类名、方法名等)然后进行处理。然而,这种方法可能会比较复杂,因为你可能需要遍历整个类b的源码。

      总的来说,如果你还没有对类b有充分的理解,那么我建议你先尝试直接通过类a获取类b的源码,然后再寻求其他解决方案。如果你觉得这种方式比较困难,那么你也可以考虑寻找其他的解决方案,如使用自然语言处理工具或使用专门的工具来提取类b的信息。

      评论 编辑记录
    • GISer Liu 2024-04-08 17:09
      关注

      该回答引用自GPT-3.5,由博主GISer Liu编写:

      针对你的问题,解决方案可以分为以下几个步骤:

      1. 解析项目源码 :首先,你需要编写代码来解析调用插件的项目里的源码。这可以通过使用Java编译器工具包(Java Compiler API)或者一些开源的Java源码解析库来实现,比如javaparser等。这样你就可以获取到项目中所有类的信息,包括引用的其他类。
      2. 检索依赖的源码 :一旦你解析了项目源码中的类和它们的依赖关系,你需要检查这些类引用的其他类是否在项目的源码中。如果是的话,直接读取相应的源码文件即可。如果不在项目源码中,那么你需要查找该类是否在maven依赖的jar包中。
      3. 获取maven依赖的源码 :对于maven依赖的jar包,如果它们包含了源码,你可以通过解析jar包来获取其中的源码。通常情况下,当你的项目依赖于一个包含源码的依赖时,Maven会将这些源码下载到本地的.m2仓库中。你可以通过读取这些源码文件来获取依赖类的源码。
      4. 处理没有源码的依赖 :对于那些没有源码的依赖,你可能需要考虑其他解决方案。一种方法是尝试通过反编译工具来反编译这些依赖的class文件,但这样可能会损失一些信息。另一种方法是查看是否有可用的文档或者API文档,虽然这可能不会给出源码,但仍然可以提供一些帮助。
      5. 整合源码信息 :最后,一旦你获取了所有类的源码,你可以根据你的需求进行进一步的处理,比如根据规则生成文档或者进行统计分析。
        下面是一个简单的Java代码大纲,用于解析项目源码和获取依赖的源码:
        javaCopy code
        // 解析项目源码
        public class ProjectParser {
        public void parseProjectSourceCode(String projectPath) {
        // 实现解析项目源码的逻辑
        }
        }
        // 获取依赖的源码
        public class DependencySourceFetcher {
        public void fetchDependencySourceCode(String dependencyGroupId, String dependencyArtifactId, String dependencyVersion) {
        // 实现获取依赖源码的逻辑
        }
        }
        // 主程序入口
        public class Main {
        public static void main(String[] args) {
        // 解析项目源码
        ProjectParser projectParser = new ProjectParser();
        projectParser.parseProjectSourceCode("path/to/your/project");
        // 获取依赖的源码
        DependencySourceFetcher dependencySourceFetcher = new DependencySourceFetcher();
        dependencySourceFetcher.fetchDependencySourceCode("group", "artifact", "version");
        }
        }
        
        你可以根据具体需求和项目结构来完善这些类的实现。

      如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

      展开全部

      评论
    编辑
    预览

    报告相同问题?

  • 相关阅读:
    如何减小pdf文件的大小
    【LeetCode每日一题】——LCP 07.传递信息
    绿某科技集团股份有限公司UTS统一威胁探针信息泄露漏洞复现 CNVD-2022-50360
    FFmpeg 6.1 开放源码多媒体框架近日发布了重大更新
    运维10个知识和经验
    使用Socks5代理和HTTP协议的爬虫技术
    【C++】异常
    学习java的第三十三天。。。(XML解析)
    【pytorch】torch.nn 与 torch.nn.functional 的区别
    Push和Pull两种类型的消费者
  • 原文地址:https://ask.csdn.net/questions/8085132