在编译Java代码库时提取一个引用图



背景:

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

我想要的是能够在签入之前打印出所有测试类的列表,这些类与git diff列表中的任何类相差2度(kevin - bacon明智)。这样我就可以运行它们,当我错过的东西最终运行并出现错误时,可以减少Jenkins发来的愤怒的电子邮件。

我能想到的实现这一点的最简单的方法是用Ruby脚本或类似的代码自己编写,这允许我解释我们使用的一些模式,但要做到这一点,我需要能够查询"哪些类引用类X?"

我可以解析。java或(更容易)。class文件来获取此信息,但我宁愿不:)是否有一种方法可以使Javac在编译时以简单的格式导出它?

有一种方法,我可以使Javac导出它在一个简单的格式,因为它编译?

AFAIK,不。

但是,还有其他方法可以获得依赖项列表:

  • 如何获得一个Java类的主类依赖列表?

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


我突然发现这里有几个问题:

  • 这听起来像你的构建,确实你的项目结构是单一的。如果你可以将代码库重组为大规模的模块,这些模块可以单独构建(根据它们的依赖关系),并单独控制版本,那么你只需要在发生变更时进行完整构建并运行所有单元测试……在一个其他一切都依赖的模块中。(我建议你用"Maven"这个词。这对大型代码库非常有帮助,11,000个类非常大)

  • 听起来你可能遇到了经典VCS系统的"分支难"问题。

  • 听起来你可能需要一个更强大的CI系统。如果您有更多的内核,并且构建框架是正确的,那么您应该能够获得更快的CI构建。(如果你模块化,这样你重建更少…)

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

但我知道,这些决定可能不是由你来做的。

相关内容

  • 没有找到相关文章

最新更新