背景:
- 我正在使用(对我来说)一个相当大的代码库(例如:我现在只签出了一些相关的项目,以及它的> 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构建。(如果你模块化,这样你重建更少…)
我认为通过这种方式解决缓慢的构建/测试周期可能比通过额外的(可能是定制的)工具来进行依赖分析更容易。
但我知道,这些决定可能不是由你来做的。