我正在尝试从一个干净的不同包中编译 100 多个 java 类 使用以下 ant 任务的目录(无增量编译):
<target name="-main-src-depend">
<depend srcdir="${src.dir}"
destdir="${bin.dir}"
cache="${cache.dir}"
closure="true"/>
</target>
<target name="compile" depends="-main-src-depend"
description="Compiles the project.">
<echo>Compiling</echo>
<javac target="${javac.target}"
source="${javac.source}"
debug="${javac.debug}"
srcdir="${src.dir}"
destdir="${bin.dir}">
<classpath>
<path refid="runtime.classpath"/>
<path refid="compile.classpath"/>
</classpath>
</javac>
</target>
但是,我第一次运行编译任务时,总是会收到 StackOverflowException。如果我再次运行该任务,编译器会进行增量构建,一切正常。这是不可取的,因为我们正在使用 CruiseControl进行自动每日构建,这会导致错误的构建失败。
作为一个快速而简单的解决方案,我创建了 2 个单独的任务,在每个任务中编译项目的一部分。我真的不认为这个解决方案会随着将来添加更多的类而有效,而且我不想在每次达到“编译限制”时都添加新的编译任务。
最佳答案
It will be nice to know; what can cause or causes a StackOverflowError during compilation of Java code?
评估 java 文件中的长表达式可能会消耗大量内存,并且因为这是与其他类的编译一起完成的,所以 VM 刚好用完堆栈空间。您生成的类可能正在插入其内容的法律限制。参见章节 4.10 Limitations of the Java Virtual Machine在 The Java Virtual Machine Specification, Second Edition .
修复 1:重构类
由于正在生成您的类(class),因此这可能不是一个选项。不过,还是值得看看您的类生成工具提供的选项,看看它是否可以生成不那么麻烦的东西。
修复 2:增加堆栈大小
我认为Kieron当他提到 -Xss 参数时有一个解决方案。 javac采用许多非标准参数,这些参数会因版本和编译器供应商而异。
我的编译器:
$ javac -version
javac 1.6.0_05
要列出它的所有选项,我会使用这些命令:
javac -help
javac -X
javac -J-X
我认为 javac 的堆栈限制默认为 512Kb。您可以使用此命令将此编译器的堆栈大小增加到 10Mb:
javac -J-Xss10M Foo.java
您可以在 javac 任务中嵌套一个 compilerarg 元素的 Ant 文件中传递它。
<javac srcdir="gen" destdir="gen-bin" debug="on" fork="true">
<compilerarg value="-J-Xss10M" />
</javac>
关于java - Ant 的 <javac> 任务抛出 StackOverflowException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16935/