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/

Anúncios

6 comentários sobre “Erro java.lang.NoClassDefFoundError: sun.awt.X11GraphicsEnvironment

  1. Cara poderia me ajudar?

    subi um sonar 3.5 aqui fazendo upgrade do 2.9 para 3.5, até o momento tudo tranquilo, porem o pessoal dos desenvolvedores estava tentando utilizar esse novo sonar com eclipse para fazer uma ‘revisao’ de codigo que eh um novo plugin do sonar 3.5, eu não entendo nada disso sou analista de rede, mas os logs no sonar constam assim :

    GRAVE: Servlet.service() for servlet chart threw exception
    java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11GraphicsEnvironment
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68)
    at sun.awt.X11.XToolkit.(XToolkit.java:89)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:169)
    at java.awt.Toolkit$2.run(Toolkit.java:834)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.awt.Toolkit.getDefaultToolkit(Toolkit.java:826)
    at sun.swing.SwingUtilities2$AATextInfo.getAATextInfo(SwingUtilities2.java:122)
    at javax.swing.plaf.metal.MetalLookAndFeel.initComponentDefaults(MetalLookAndFeel.java:1554)
    at javax.swing.plaf.basic.BasicLookAndFeel.getDefaults(BasicLookAndFeel.java:130)
    at javax.swing.plaf.metal.MetalLookAndFeel.getDefaults(MetalLookAndFeel.java:1589)
    at javax.swing.UIManager.setLookAndFeel(UIManager.java:514)
    at javax.swing.UIManager.setLookAndFeel(UIManager.java:554)
    at javax.swing.UIManager.initializeDefaultLAF(UIManager.java:1317)
    at javax.swing.UIManager.initialize(UIManager.java:1406)
    at javax.swing.UIManager.maybeInitialize(UIManager.java:1394)
    at javax.swing.UIManager.getDefaults(UIManager.java:633)
    at javax.swing.UIManager.getColor(UIManager.java:675)
    at org.jfree.chart.JFreeChart.(JFreeChart.java:252)
    at org.sonar.api.charts.AbstractChart.generateImage(AbstractChart.java:58)
    at org.sonar.server.charts.ChartsServlet.doGet(ChartsServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.jruby.rack.RackFilter.doFilterInternal(RackFilter.java:78)
    at org.jruby.rack.UnmappedRackFilter.isDoDispatch(UnmappedRackFilter.java:106)
    at org.jruby.rack.AbstractFilter.isDoDispatch(AbstractFilter.java:107)
    at org.jruby.rack.AbstractFilter.doFilter(AbstractFilter.java:65)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.sonar.server.platform.MasterServletFilter.doFilter(MasterServletFilter.java:83)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.sonar.server.ui.DatabaseSessionFilter.doFilter(DatabaseSessionFilter.java:34)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.mortbay.servlet.UserAgentFilter.doFilter(UserAgentFilter.java:78)
    at org.mortbay.servlet.GzipFilter.doFilter(GzipFilter.java:131)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.apache.catalina.core.StandardWrapperValve.invoke(Unknown Source)
    at org.apache.catalina.core.StandardContextValve.invoke(Unknown Source)
    at org.apache.catalina.core.StandardHostValve.invoke(Unknown Source)
    at org.apache.catalina.valves.ErrorReportValve.invoke(Unknown Source)
    at org.apache.catalina.core.StandardEngineValve.invoke(Unknown Source)
    at org.apache.catalina.connector.CoyoteAdapter.service(Unknown Source)
    at org.apache.coyote.http11.Http11AprProcessor.process(Unknown Source)
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Unknown Source)
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:662)
    26/04/2013 14:07:36 org.apache.catalina.core.StandardWrapperValve invoke
    GRAVE: Servlet.service() for servlet chart threw exception
    java.lang.NoClassDefFoundError: Could not initialize class org.jfree.chart.JFreeChart
    at org.sonar.api.charts.AbstractChart.generateImage(AbstractChart.java:58)
    at org.sonar.server.charts.ChartsServlet.doGet(ChartsServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.jruby.rack.RackFilter.doFilterInternal(RackFilter.java:78)
    at org.jruby.rack.UnmappedRackFilter.isDoDispatch(UnmappedRackFilter.java:106)
    at org.jruby.rack.AbstractFilter.isDoDispatch(AbstractFilter.java:107)
    at org.jruby.rack.AbstractFilter.doFilter(AbstractFilter.java:65)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.sonar.server.platform.MasterServletFilter.doFilter(MasterServletFilter.java:83)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Source)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(Unknown Source)
    at org.sonar.server.ui.DatabaseSessionFilter.doFilter(DatabaseSessionFilter.java:34)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Unknown Sourc

    1. Este erro ocorre no servidor que hospeda o Sonar? Em qual servidor de aplicação (Tomcat, JBoss, etc) o Sonar foi implantado? Já tentou aplicar a propriedade ‘-Djava.awt.headless=true’ na linha de comando que inicia processo (Java Virtual Machine) que executa o servidor Sonar?

      1. linux debian testing, esta rodando via localhost, somente tomcat + sonar 3.5
        esse propriedade eu adicionei em ./startup.sh na ultima linha certo? ou não é lá?

        jdk 1.6_0.33
        servidor linux debian
        apache-tomcat 6
        sonar 3.5
        bd mysql

      2. ~/.bash_profile

        # User specific environment and startup programs

        PATH=$PATH:$HOME/bin
        ENV=$HOME/.bash_profile
        USERNAME=”tomcat”

        export SONAR_HOME=/opt/sonar-3.5
        export JAVA_HOME=/opt/jdk1.6.0_33
        export JRE_HOME=JAVA_HOME/jre
        export CLASSPATH=.:$JAVA_GOME/lib:$JRE_HOME/lib
        export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH

        export CATALINA_HOME=/opt/apache-tomcat-6.0.36
        export CATALINA_BASE=/opt/apache-tomcat-6.0.36
        export CATALINA_HOME=/opt/apache-tomcat-6.0.36
        export CATALINA_TMPDIR=/opt/apache-tomcat-6.0.36/temp
        export CLASSPATH=opt/apache-tomcat-6.0.36/bin/bootstrap.jar
        export JRE_HOME=/opt/jdk1.6.0_33/jre/

        ## tentei assim no profile e no arquivo /opt/apache-tomcat/bin/startup.sh
        export CATALINA_OPTS=-Djava.awt.headless=true
        export JAVA_OPTS=-Djava.awt.headless=true
        export JAVA_OPTS=”${JAVA_OPTS}-Djava.awt.headless=true”

        export PERL_LOCAL_LIB_ROOT=”/opt/tomcat/perl5″;
        export PERL_MB_OPT=”–install_base /opt/tomcat/perl5″;
        export PERL_MM_OPT=”INSTALL_BASE=/opt/tomcat/perl5″;
        export PERL5LIB=”/opt/tomcat/perl5/lib/perl5/x86_64-linux-gnu-thread-multi:/opt/tomcat/perl5/lib/perl5″;
        export PATH=”/opt/tomcat/perl5/bin:$PATH”;
        eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)
        export PERL_MM_USE_DEFAULT=1
        eval $(perl -I$HOME/perl5/lib/perl5 -Mlocal::lib)
        export PERL_MM_USE_DEFAULT=1

        export PATH=$PATH:/opt/apache-maven-2.2.1/bin:$PATH

  2. a lib jfreechart já tem no server :

    [tomcat@zeus] opt $ find . -print | grep -i jfreechart
    ./sonar-3.5/war/sonar-server/WEB-INF/lib/jfreechart-1.0.9.jar
    ./sonar-3.5/war/build/sonar-server/WEB-INF/lib/jfreechart-1.0.9.jar
    ./tomcat/.m2/repository/jfree/jfreechart
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.12
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.12/jfreechart-1.0.12.jar.sha1
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.12/jfreechart-1.0.12.pom
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.12/jfreechart-1.0.12.pom.sha1
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.12/jfreechart-1.0.12.jar
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.9
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.jar.sha1
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.pom.sha1
    ./tomcat/.m2/repository/jfree/jfreechart/1.0.9/jfreechart-1.0.9.pom
    ./tomcat/.m2/repository/jfreechart
    ./tomcat/.m2/repository/jfreechart/jfreechart
    ./tomcat/.m2/repository/jfreechart/jfreechart/1.0.0
    ./tomcat/.m2/repository/jfreechart/jfreechart/1.0.0/jfreechart-1.0.0.pom
    ./tomcat/.m2/repository/jfreechart/jfreechart/1.0.0/jfreechart-1.0.0.jar.sha1
    ./tomcat/.m2/repository/jfreechart/jfreechart/1.0.0/jfreechart-1.0.0.jar
    ./tomcat/.m2/repository/jfreechart/jfreechart/1.0.0/jfreechart-1.0.0.pom.sha1
    ./apache-tomcat-6.0.36/webapps/sonar/WEB-INF/lib/jfreechart-1.0.9.jar
    ./apache-tomcat-6.0.36/temp/0-sonar/WEB-INF/lib/jfreechart-1.0.9.jar

  3. error no eclipse :

    14:17:23) Eduardo Costa: ERROR: Error during Sonar runner execution
    ERROR: Fail to download libraries from server
    ERROR: Caused by: http://10.0.0.61:8080/deploy/bootstrap/index.txt
    ERROR:
    ERROR: To see the full stack trace of the errors, re-run Sonar Runner with the -e switch.
    ERROR: Re-run Sonar Runner using the -X switch to enable full debug logging.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s