Tive que resolver um problema ontem sem muita documentação na Internet, resolvi postar aqui apra uma pobre alma ter alguma noção.
Tivemos um erro de ClassFormatError com uma stacktrace que não diz muita coisa exceto que houve um erro no constant pool de uma Interface cheia de constantes ao executar um Servlet, apenas quando executado dentro da IDE (Eclipse). Detalhe que se alterar o tipo de uma das constantes de Integer para int funcionava.
O tipo diz que houve um problema com o arquivo .class gerado. Minha primeira suspeita foi a miríade de JVMs utilizadas (compila em Java 1.3 e roda em 1.4), um bug talvez? Para identificar o problema fiz checkout de uma versão que não dava problema e fui fazendo uma busca binária entre ela e a versão no HEAD do CVS (não, não tenho sorte de utilizar Subversion), achei o problema em uma integração feita ontem.
O problema era no buildfile. Utilizamos os filtros do ant para gerar versões diferentes dos arquivos de configuração por ambiente (QA, Produção, servidores de desenvolvimento, etc.) e simplesmente durante um build local alguém estava aplicando este filtro…nos arquivos .class.
Coincidentemente havia um arquivo cuja sequência de bytes batia com uma sequência que este filtro substituía. Essa sequência era iniciada pelo tal do Integer, por isso quando alterávemos pra int não ocorria o problema. Claro que isso poderia acotnecer em qualquer lugar a qualquer momento. A solução foi simplesmente retirar o filtro dos .class.
Ou seja: se você tiver um problema desse tem alguém corrompendo seus arquivos, procure por tarefas que copiam, zipam, transferem, etc. estes e gere um checksum entre o compilado e o que foi feito o deploy.
O pessoal se esforça pra fazer M, einh?
Acabei de entrar para o seu time de pessoas que convivem com ClassFormatError, e desta vez sem filtros sendo aplicados em .class. :)