java - Ant 的 <javac> 任务抛出 StackOverflowException

标签 java ant

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

相关文章:

java - Docker 容器中 PostgreSQL 数据库的正确 JDBC 连接 URL

java - Apache Velocity 2.0 如何编写自定义资源加载器?

java - 你使用ant的<depend>任务吗?

Ant - Java 命令 - IllegalAccessException

java - Ant对属性名称有什么要求?

java - 我正在尝试用 java 制作一个沙漏作为 ASCII 艺术,其高度由我可以更改的变量控制

java - 使用带有 int 值的 setAttribute 方法

java - 从html源代码获取链接

java - 为什么 Java 对常量的依赖不会导致重新编译?

java - war 不支持嵌套的 "fileset"元素