私は約 800 個のソース ファイル (javacc/JTB によって生成されたもの) を含む Java Maven プロジェクトを持っていますが、これは javac でコンパイルするのに 25 分かかります。
Eclipse コンパイラーを使用するように pom.xml を変更したところ、コンパイルに約 30 秒かかりました。
javac (1.5) の実行速度が非常に遅い理由について何か提案はありますか? (Maven のプラグインには少しバグがあるように見えるので、Eclipse コンパイラーに永久に切り替えたくありません。)
問題を簡単に再現できるテストケースがあります。次のコードは、既定のパッケージに多数のソース ファイルを生成します。ImplementingClass.java を javac でコンパイルしようとすると、異常に長い時間停止するように見えます。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class CodeGenerator
{
private final static String PATH = System.getProperty("java.io.tmpdir");
private final static int NUM_TYPES = 1000;
public static void main(String[] args) throws FileNotFoundException
{
PrintStream interfacePs = new PrintStream(PATH + File.separator + "Interface.java");
PrintStream abstractClassPs = new PrintStream(PATH + File.separator + "AbstractClass.java");
PrintStream implementingClassPs = new PrintStream(PATH + File.separator + "ImplementingClass.java");
interfacePs.println("public interface Interface<T> {");
abstractClassPs.println("public abstract class AbstractClass<T> implements Interface<T> {");
implementingClassPs.println("public class ImplementingClass extends AbstractClass<Object> {");
for (int i=0; i<NUM_TYPES; i++)
{
String nodeName = "Node" + i;
PrintStream nodePs = new PrintStream(PATH + File.separator + nodeName + ".java");
nodePs.printf("public class %s { }\n", nodeName);
nodePs.close();
interfacePs.printf("void visit(%s node, T obj);%n", nodeName);
abstractClassPs.printf("public void visit(%s node, T obj) { System.out.println(obj.toString()); }%n", nodeName);
}
interfacePs.println("}");
abstractClassPs.println("}");
implementingClassPs.println("}");
interfacePs.close();
abstractClassPs.close();
implementingClassPs.close();
}
}