代码之家  ›  专栏  ›  技术社区  ›  Sophistifunk

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

  •  2
  • Sophistifunk  · 技术社区  · 11 年前

    背景:

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

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

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

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

    1 回复  |  直到 11 年前
        1
  •  3
  •   Community CDub    7 年前

    有没有一种方法可以让Javac在编译时以简单的格式导出它?

    AFAIK,编号。

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

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


    我突然想到这里有几个问题:

    • 在我看来,这听起来像是你的构建,实际上你的项目结构是整体的。如果你可以将代码库重组为单独构建的大规模模块(根据它们的依赖关系),并单独进行版本控制,那么你只需要进行完整的构建,并在高层发生变化时运行所有单元测试。。。在一个其他一切都依赖的模块中

    • 听起来你可能正遭受着经典VCS系统的“分支很难”问题的困扰。

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

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

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