Problema com java.lang.StackOverflowError apenas ao compilar com Ant

Estou finalizando um sisteminha para geração de arquivos XML e gostaria de começar a preparar testes automatizados porque daqui a pouco começarei a receber os dados necessários para a geração do XML. Eu deveria ter feito este testes antes, mas enfim, nem sempre as coisas acontecem do jeito que a gente quer…

O ponto é que ao compilar pelo Ant eu recebo um erro:

Buildfile: C:\desenvolvimento\workspace\lalala\build.xml
init:
compile:
    [javac] Compiling 129 source files to C:\desenvolvimento\workspace\lalala\build
    [javac] The system is out of resources.
    [javac] Consult the following stack trace for details.
    [javac] java.lang.StackOverflowError
    [javac] 	at com.sun.tools.javac.code.Types.adapt(Types.java:3014)
    [javac] 	at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977)
    [javac] 	at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986)
    [javac] 	at com.sun.tools.javac.code.Types.adapt(Types.java:3016)
    [javac] 	at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977)
    [javac] 	at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986)
    [javac] 	at com.sun.tools.javac.code.Types.adapt(Types.java:3016)

BUILD FAILED
C:\desenvolvimento\workspace\lalala\build.xml:13: Compile failed; see the compiler error output for details.

Já dei uma olhada no build.xml mas não consegui encontrar problemas:

[code]

<description>lalala</description>

<property name="dir_src_main" location="src/main/java" />
<property name="dir_src_test" location="src/test/java" />
<property name="dir_resources" location="src/main/resources" />
<property name="dir_build" location="build" />
<property name="dir_lib" location="lib" />
<property name="dir_reports" location="reports" />

<target name="compile" depends="init" description="compila o código">
	<javac srcdir="${dir_src_main}" destdir="${dir_build}">
		<classpath>
			<fileset dir="${dir_lib}">
				<include name="**/*.jar" />
			</fileset>
			<pathelement path="${dir_resources}"/>
		</classpath>
	</javac>
</target>
<target name="init" description="inicializa o ambiente">
	<tstamp />
	<mkdir dir="${dir_build}" />
	<mkdir dir="${dir_reports}" />
	<mkdir dir="${dir_reports}/raw/" />
	<mkdir dir="${dir_reports}/html/" />
</target>

[/code]

Alguém sabe o que pode estar causando este erro?

Abraços a todos!

http://ant.apache.org/manual/CoreTasks/javac.html

Eu usaria “fork=‘yes’” (veja a documentação acima).

Eu acabo de seguir a sua sugestão, embora não tenha resolvido o problema. De qualquer forma estou dando uma lida na documentação que vc me mandou.

Um detalhe que não mencionei: as três últimas linhas do stackTrace do erro se repetem indefinidamente. Isso provavelmente está ligado ou “out of resources”.

Abraços,

Hoje curiosamente o erro está diferente! Não fiz mudanças significativas no código, só adicionei testes automatizados e mudei algumas classes de pacote. Vejam:

[javac] The system is out of resources. [javac] Consult the following stack trace for details. [javac] java.lang.StackOverflowError [javac] at com.sun.tools.javac.code.Types$1.visitWildcardType(Types.java:98) [javac] at com.sun.tools.javac.code.Type$WildcardType.accept(Type.java:416) [javac] at com.sun.tools.javac.code.Types$MapVisitor.visit(Types.java:3232) [javac] at com.sun.tools.javac.code.Types.upperBound(Types.java:95) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) [javac] at com.sun.tools.javac.code.Types.adapt(Types.java:3016) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) [javac] at com.sun.tools.javac.code.Types.adapt(Types.java:3016) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) [javac] at com.sun.tools.javac.code.Types.adapt(Types.java:3016)

Pelas primeiras linhas acredito que seja algo ligado a tipos genéricos mas não consegui identificar o que exatamente. Depois de mudar para o JDK 5 (Costumo usar JDK 6) eu consegui receber uma mensagem de erro um pouco melhor, informando problema relacionado a um cast na saída de um método que retorna um tipo genérico. Modifiquei o código para que não fosse mais necessário o cast mas recebi uma mensagem muito parecida com a anterior, tanto no JDK 5 como no JDK 6:

[javac] The system is out of resources. [javac] Consult the following stack trace for details. [javac] java.lang.StackOverflowError [javac] at com.sun.tools.javac.code.Types$MapVisitor.visit(Types.java:3232) [javac] at com.sun.tools.javac.code.Types.upperBound(Types.java:95) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) [javac] at com.sun.tools.javac.code.Types.adapt(Types.java:3016) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2977) [javac] at com.sun.tools.javac.code.Types.adaptRecursive(Types.java:2986) [javac] at com.sun.tools.javac.code.Types.adapt(Types.java:3016)

Alguém tem idéia do que seja essa mensagem?

Curiosamente, tentei novamente hj de manhã e agora foi exibido um erro mais específico!

Todos os problemas são muito parecidos, segue um exemplo abaixo:

[javac] C:\desenvolvimento\workspace\lalala\src\main\java\br\com\visagio\modelo\auxiliares\resultado\ResultadoQuadroResumo.java:191: inconvertible types [javac] found : br.com.lalala.modelo.auxiliares.abstratas.Resultado<capture#479 of ?,capture#732 of ?,capture#356 of ?> [javac] required: br.com.lalala.modelo.auxiliares.resultado.ResultadoTarifacao [javac] adicionarTarifacao((ResultadoTarifacao) resultadoAdicionavel);

Vamos ao trecho de código especificado:

[code]
if (resultadoAdicionavel instanceof ResultadoTarifacao) {

    adicionarTarifacao((ResultadoTarifacao) resultadoAdicionavel);[/code]

Qual seria o problema aqui? Pensando apenas na linha do cast, eu até entenderia um problema em tempo de execução (ClassCastException), mas não na compilação. E se considerar o “if” logo acima, não vejo problema nem em tempo de execução, pois o objeto seria verificado antes.

Obs: Eu costumo evitar cast’s ao extremo, sempre uso tipos genéricos, mas no fim encontrei uma classe que fugia a regra e acabei optando por criar algo mais simples usando cast’s.

Abraços a todos!