使用ANT,Javacc,JUnit和编译Java类来加快在Linux上构建时间的提示
我们有一个庞大的代码库,在开发人员机器上花费大约12分钟的时间,才能使用JavaCC自动生成某些Java 5类,然后编译所有类并运行单元测试。
该项目由多个项目组成,这些项目可以分组构建,但我们的目标是在10分钟内完成一个完整的构建
有什么技巧可以减少构建时间?
谢谢
解决方案
一种可能会节省一些时间的快速修复方法是,确保我们正在使用服务器JVM(默认情况下使用客户端VM)运行Ant。将ANT_OPTS设置为包括" -server"。
- 分析构建过程并查看瓶颈在哪里。这样可以为我们提供一些有关如何改进流程的想法。
- 尝试在多核/ CPU计算机上并行构建独立项目。作为该想法的扩展,我们可能需要寻找一种与distcc(不知道它是否存在)等效的Java,以便在多个计算机上分发构建。
- 获得更好的机器。
这在短期内可能无济于事,但我想无论如何我都应该把它扔出去。
如果项目可以分解为较小的项目(例如,数据库子系统,日志记录),那么我们可能会对使用诸如maven之类的东西来处理构建感兴趣。我们可以将每个较小的部分作为单独的项目或者模块运行,如果存在更改,maven将能够维护需要构建的内容。在此构建过程中,我们可以专注于项目的主要部分,而所需的时间几乎不会那么长。
花费时间的细分是什么:
- 生成类
- 编译课程
- 运行测试
根据项目,通过为javac(memoryMaximumSize)和junit(maxmemory)分配更大的堆大小,我们可能会看到构建时间的显着增加。
尝试从务实的程序员那里得到启发。仅编译必要的内容,并具有两个或者多个测试套件。一种用于快速测试,另一种用于全面测试。考虑是否真的需要每次使用每个构建步骤。有必要尝试使用jikes编译器而不是javac。在项目涵盖了数百个课程之后,我切换到jikes来提高速度。但是要注意潜在的不兼容问题。不要忘记在一个目标中包含一个目标,以执行完整重建和项目测试的每一步。
现在,我们已经详细解释了该过程,这里还有另外两个选项:
- 一个专用的机器/群集,在该机器/群集中执行构建的速度比在普通工作站上快得多。然后,开发人员将在提交之前运行脚本,以在专用计算机/集群上构建其代码。
- 将分区更改为子项目,这样就很难通过修改另一个项目来破坏一个项目。然后,这将使在每次提交之前进行完整构建的重要性降低。然后,只有涉及敏感子项目的提交或者跨越多个项目的提交才需要通过完整构建进行"检查"。
整个构建持续少于10分钟是否非常重要?如果使子项目彼此独立,则可以在已编译另一个子项目的情况下处理一个子项目(请考虑使用Maven或者Ivy来管理依赖项)。
另一个解决方案(如果模块相当稳定)是将子项目视为独立项目。然后,每个项目都将遵循其自己的发布周期,并且可以从本地Maven / Ivy存储库中获得。如果项目的至少一部分相当稳定,那么这当然很有效。