在编译Java时使用多个核心/处理器

时间:2010-09-16 14:10:43

标签: java ant parallel-builds

我使用具有八个内核的桌面来使用Ant(通过javac目标)构建Java应用程序。有没有办法通过使用多个线程或进程来加速编译?

我知道我可以并行运行几个Ant任务,但我不认为这可以应用于单个编译目标,或者它是什么?

6 个答案:

答案 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个文件的依赖关系大部分不同,则可以节省时间,如果依赖关系重叠,则可能不会节省太多时间。