gpt4 book ai didi

java - Ant 的 任务抛出 StackOverflowException

转载 作者:搜寻专家 更新时间:2023-10-31 19:36:32 24 4
gpt4 key购买 nike

我正在尝试从一个干净的不同包中编译 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 MachineThe 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com