segunda-feira, setembro 27, 2010

JasperServer: Bad version number in .class file

Este blog estava a muito tempo parado, mas hoje resolvi postar aqui a solução para um problema que me tirou de combate quase três dias.
 
Estou testando e implementando o JasperServer na empresa em que trabalho como alternativa free ao Microsoft Reporting Services.
 
Tudo ocorreu bem nos testes no ambiente de desenvolvimento (leia-se localhost).
Criei um relatório que acessa uma base Oracle e um acessando uma outra base de dados SQL Server.
 
No ambiente de desenvolvimento estava usando o JasperServer 3.7.0 e para isso eu instalei o MySQL, o Tomcat 6 e rodei os arquivos Ant do JasperServer para gerar o .war que depois instalei no Tomcat. Tudo isso rodando com a versão 1.6.0_20 do JDK.
 
Para o ambiente de produção o JDK já era mais atual, o 1.6.0_21 e o JavaServer também era mais atual, a versão 3.7.1 que é uma distribuição all-in-one com o Tomcat 5.5, MySQL, etc.
Ai começaram meus problemas! :)
 
O relatório que eu desenvolvi para SQL Server não funcionava em produção acusando o seguinte erro:
 
    org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.UnsupportedClassVersionError: Bad version number in .class file
 
Bati cabeça atrás do erro fazendo várias perguntas nas listas do RIOJUG, Sou Java, RSJUG, etc e fazendo muitos despachos para Pai Google e a conclusão apontada era que a versão do JDK que foi compilado o relatório era diferente da versão do JDK em produção.
Lá fui eu atualizar o JDK no ambiente de desenvolvimento e o erro persistia em produção.
 
Até, que um camarada em uma lista de discussão deu a dica para eu checar se o Tomcat estava realmente usando o JDK que eu queria que ele usasse.
Comecei a catar o usuário e senha para acessar a área administrativa do Tomcat 5.5 que vem na distribuição do JasperServer 3.7.1 e não achei o arquivo tomcat-users.xml no diretório C:\Program Files\JasperServer-ce-3.7.1\apache-tomcat\conf, então fui ver como o bat jasperctl (C:\Program Files\JasperServer-ce-3.7.1\jasperctl.bat) inicializa o Tomcat e achei a seguinte pérola:
 
set JAVA_HOME= C:\Program Files\JasperServer-ce-3.7.1\java
set JRE_HOME= C:\Program Files\JasperServer-ce-3.7.1\java
 
Opa! O cara está apontando para um JDK e uma JRE que não é a que eu instalei no servidor, e ela está desatualizada! Beleza, foi só trocar os valores para apontar para os locais certos que o relatório passou a funcionar. ;)
 
Aqui está como ficou.
 
set JAVA_HOME=C:\Program Files\Java\JDK1.6.0_21
set JRE_HOME=C:\Program Files\Java\JRE6
 
Fica a dica.