【发布时间】:2010-10-15 18:03:07
【问题描述】:
我有一个 Java Maven 项目,其中包含大约 800 个源文件(一些由 javacc/JTB 生成),使用 javac 编译需要 25 分钟。
当我将 pom.xml 更改为使用 Eclipse 编译器时,编译大约需要 30 秒。
关于为什么 javac (1.5) 运行如此缓慢的任何建议? (我不想永久切换到 Eclipse 编译器,因为 Maven 的插件似乎有点错误。)
我有一个很容易重现问题的测试用例。下面的代码在默认包中生成了一些源文件。如果您尝试使用 javac 编译 ImplementingClass.java,它似乎会暂停很长时间。
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();
}
}
【问题讨论】:
-
尝试生成 SSCCE (sscce.org) 并向 Sun (bugs.sun.com) 提交错误报告。特别是因为您已经将问题减少到一个非常具体的案例。
-
您使用的是什么操作系统?这对我来说很快……在 OS X 上。
-
这是在 Windows XP 和 Windows Server 2003 上
-
你是在命令行上用javac还是在eclipse或maven中编译了上面的代码?如果不是 javac 本身,请尝试一下,看看它是否有相同的减速。只是为了消除 maven/eclipse 作为一个问题。
-
我记得几年前发生的另一件事是,我们使用的防病毒软件被配置为检查文件的每次访问,这会导致性能下降。可能是 eclipse 编译器将文件内容缓存在内存中,而 javac 没有,并且某些东西减慢了文件访问速度。
标签: java eclipse maven-2 javac