在编译Java代码库时提取参考图?

时间:2013-04-18 00:47:13

标签: java ant javac

背景:

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

我想要的是,在签到之前打印出来自git diff列表中任何类的所有两度测试类(Kevin-Bacon-wise)的列表的能力。通过这种方式,我可以运行它们并减少来自Jenkins的愤怒电子邮件,当我错过的内容最终运行并出现错误时。

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

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

1 个答案:

答案 0 :(得分:3)

  

有没有办法让Javac在编译时以简单的格式导出它?

AFAIK,没有。

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

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


我觉得这里有一些问题:

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

  • 听起来您可能会遇到经典VCS系统的“分支难”问题。

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

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

但我承认,做出这些决定可能不适合你。