我使用具有八个内核的桌面来使用Ant(通过javac目标)构建Java应用程序。有没有办法通过使用多个线程或进程来加速编译?
我知道我可以并行运行几个Ant任务,但我不认为这可以应用于单个编译目标,或者它是什么?
答案 0 :(得分:17)
我不知道有什么方法可以告诉ant本身有效使用多个内核。但是you can tell ant to use the Eclipse Compiler,它支持multithreaded compilation内置。
答案 1 :(得分:2)
只要您调用的javac不使用所有内核,您在Ant中所说的内容并不重要。您可以使用compiler
属性来定义应该用于任务的java编译器。
如果您有多个构建目标,则可以使用fork=yes
从外部执行目标。
http://ant.apache.org/manual/Tasks/javac.html#compilervalues
答案 2 :(得分:1)
The documentation似乎表明它不太可能与javac
一起正常使用。
任何试图并行运行大型Ant任务序列的人,例如javadoc和javac,都隐含地承担了识别和修复所有并发错误的任务。
因此,虽然此任务有用,但应将其视为应在某些批处理或测试情况下使用的高级任务,而不是加速多路CPU上构建时间的简单技巧。
答案 3 :(得分:0)
据我所知。 Eclipse编译器已经做了一些工作来加速使用多个内核,但它并没有像您希望的那样购买。
问题是,您是否可以使用渐进式编译进行开发,只重新编译那些已更改的内容?然后可以将完全重建留给构建服务器。
答案 4 :(得分:0)
您可以使用Buck Build来提高构建速度并使用多个核心。
简而言之:
Buck是Facebook开发和使用的构建系统。它鼓励 创建由代码和代码组成的小型可重用模块 资源,并在许多平台上支持各种语言。
Buck并行构建独立的工件以利用多个 你机器上的核心。此外,它减少了增量构建时间 跟踪未更改的模块,以便最小化模块集 重建。
答案 5 :(得分:0)
我认为这样做可能无济于事,因为javac可以拉出内存中的所有文件,如果它必须通过多个进程来执行此操作,那只会加倍努力。但是,如果要编译两个相当独立的Java代码,则可以执行以下操作:
#!/usr/bin/env bash
javac file1.java &
javac file2.java &
javac file3.java &
wait;
如果3个文件的依赖关系大部分不同,则可以节省时间,如果依赖关系重叠,则可能不会节省太多时间。