gpt4 book ai didi

java - 在编译 Java 代码库时提取引用图?

转载 作者:行者123 更新时间:2023-12-04 05:01:51 26 4
gpt4 key购买 nike

背景:

  • 我正在使用(对我而言)一个相当大的代码库(例如:我目前只检查了一些相关项目,以及它的 > 11000 个类)。
  • Build 是 ant,Tests 是 JUnit,CI 是 Jenkins。
  • 在 checkin 之前运行所有测试不是一种选择,它需要 Jenkins 几个小时。即使对于某些单独的应用程序,它也可能是 45 分钟。
  • 有些测试不引用基于反射的单个方法,在某些情况下甚至不直接引用被测方法的类,因为它们询问聚合器类,并且知道传递方法的模式在这里使用。因为它是一个很大的代码库,超过 10 个开发人员,而且我不是负责人,所以这是我目前无法更改的。

  • 我想要的是能够在 checkin 之前打印出与 git diff 列表中的任何类相距两度(Kevin-Bacon-wise)的所有测试类的列表。这样,当我错过的东西最终运行并出现错误时,我可以将它们全部运行并减少来自 Jenkins 的愤怒电子邮件。

    我能想到的最简单的方法是自己用 Ruby 脚本或类似的脚本编写代码,这样我就可以解释我们正在使用的一些模式,但要做到这一点,我需要能够查询“哪个类引用类 X?”

    我可以解析 .java 或(更简单的) .class 文件来获取此信息,但我不想:) 有没有办法让 Javac 在编译时以简单的格式导出它?

    最佳答案

    Is there a way I can make Javac export it in a simple format as it compiles?



    AFAIK,不。

    但是,还有其他方法可以获取依赖项列表:
  • How do I get a list of Java class dependencies for a main class? .

  • (但请注意,您不太可能获得静态工具来提取由 Class.forName() 等产生的依赖关系。另请注意,由于“编译时间常量”的处理方式,您无法从字节码文件中推断出完整的依赖关系。 )

    我觉得这里有几个问题:
  • 这听起来像你的构建,实际上你的项目结构是单一的。如果您可以将代码库重组为单独构建的大型模块(根据它们的依赖关系),并单独控制版本,那么您只需要进行完整的构建并在发生变化时运行所有单元测试.. . 在其他一切都依赖的模块中。 (我可以建议使用“Maven”这个词吗?它确实对大型代码库很有帮助,而且 11,000 个类很大。)
  • 听起来您可能正遭受经典 VCS 系统的“分支很难”问题。
  • 听起来您可能需要更强大的 CI 系统。如果你有更多的内核并且构建框架是正确的,你应该能够获得更快的 CI 构建。 (如果你模块化以便重建更少......)

  • 我认为以这种方式解决缓慢的构建/测试周期可能比通过额外的(可能是定制的)工具来进行依赖性分析更容易。

    但我认识到,做出这些决定可能不取决于你。

    关于java - 在编译 Java 代码库时提取引用图?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16072683/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com