Geral, JBoss

Erro java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment

Depois de um longo tempo (tipo… quase 2 anos :-)) sem postar nada no blog, resolvi voltar a postar…

Neste post desejo compartilhar um “workaround” que encontrei na NET (depois de uma googlada básica) quando me deparei com um problema esquisito em uma aplicação web “deployada” no JBoss AS. Uma das funcionalidades dessa app faz a geração online de uns relatórios em PDF usando o JasperReports. As vezes a aplicação não consegue gerar o relatório e lança a seguinte exception no log do AS: java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment. Encontrei algumas explicações na net (refs. [1] e [2]) que dizem, aparentemente, ser uma pala relacionada às bibliotecas gráficas em ambientes Linux/Unix. Segundo o trecho abaixo copiado da ref. [1] as bibliotecas AWT da Sun dependem do sistema de janelas X do Linux.

Sem aprofundar muito na questão de como a JVM abstrai isso do SO… O lance é que em ambientes de produção geralmente o ambiente gráfico do S.O (X11) está ausente. A ref. [1] sugere executar uma versão do X Server sem display (Xvfb), ou seja, o Xvfb executa as operações gráficas em memória. Após rodar o Xvfb deve-se configurar a var. de ambiente $DISPLAY do S.O apontando para esse daemond. Além dessa opção do Xvfb, ele sugere setar a JVM property "-Djava.awt.headless=true" que supostamente resolve o problema. Como a 1º opção é um pouco mais complicada preferi configurar a JVM Property mesmo. Em princípio o problema foi sanado, pelo menos, até o momento.

Caso queira saber masi sobre como usar o Xvfb em ambientes sem o X instalado veja a ref. [3] que mostra um cenário em que foi utilizado um Selenium para realização de testes em um servidor sem ambiente gráfico instalado.

_________
Referências:
[1] http://www.jguru.com/faq/view.jsp?EID=222296
[2] http://www.theserverside.com/discussions/thread.tss?thread_id=16049
[3] http://www.jeveaux.com/blog/2008/xvfb-como-usar-o-selenium-sem-ter-um-x-server/