Cuidado con la multiplataforma

Publicado en Java el 22 de September, 2008 por Lek.

Una de las cosas que se nos vende con Java es que al depender de una máquina virtual tu código es independiente de la plataforma sobre la que se ejecute. Esta afirmación se cumple para la gran mayoría de casos (especialmente si eres un buen programador y utilizas los menores literales posibles), pero no es una tautología. Es como decir que la tierra es esférica. Casi, pero no.

Una cosa muy curiosa que me ha pasado hoy y me ha tenido entretenido la mitad del día va relacionada con esto. Para ciertas tareas Java se apoya en librerías nativas del sistema operativo. Y con los nativos hemos topado. Imaginad que os habéis currado una aplicación que os muestra una serie de gráficos. Depurais, probais, mostrais al cliente y, por fin, pasais a producción. Aquí se produce la hecatombe. Error Java chungo:

Can’t connect to X11 window server using ‘:0.0′ as the value of the DISPLAY variable.

Situación: Servidor web Tomcat más viejo que la tarara montado sobre un Linux más viejo que el Tomcat más viejo que la tarara. A pesar de que me ha llevado bastante decidirme a buscarlo en Google pensando que sería un tema de librerías, al parecer es un problema bastante común en librerías no-PJA (Puro Java AWT), como jFreeChart, cuando el equipo donde se está ejecutando la aplicación no tiene un servidor gráfico rulando. Si fueran librerías Java puras no pasaría nada.

La solución es tan sencilla como lo que sigue como añadir la siguiente línea en el catalina.sh:

CATALINA_OPTS=”-Djava.awt.headless=true”

El motivo es que las funciones gráficas necesitan una ventana X ejecutándose. Si no la hay, el comando anterior le dice a la ejecución que utilice buffers virtuales (Fuente).

Y ahora, la pregunta. Si el programa instalado era una actualización, ¿cómo funcionaba antes?

5 comentarios

  1. Uy, la última pregunta me suena mucho. Allá cuando programaba en C++, una aplicación funcionaba a las mil maravillas y llevaba varios meses funcionando. De repente, a partir de un día, empezó a caerse con “core dumped” una vez sí y otra también. Depurando, depurando, el típico puntero no inicializado. ¿cómo había funcionado bien hasta el momento?. Milagros de la informática.

    Se bueno.

    #  chuidiang 22 de September, 2008

  2. Lo de los punteros sin inicializar tiene su cosa, porque en según que sistemas (o versiones de ellos) puede que se inicialicen de manera predeterminada a NULL o no.

    Lo de Java ya me resulta más raro.

    #  Fran 23 de September, 2008

  3. realmente no hace falta que el servidor se esté ejecutando, sólo que estén instaladas las librerías. Y lo cierto es que es algo que sucede desde el principio de los tiempos, no es nuevo, el tema de headless es un parche que se inventaron.

    Respecto a por qué funcionaba antes… sin conocer los detalles… quizás porque la versión anterior traía el flag por defecto el lanzar la aplicación?. Si tenía un script, o un exe, o cualquier otro tipo de lanzador no es nada raro.

    #  author 30 de September, 2008

  4. Author, no es por ningún script, porque la aplicación en cuestión va sobre Tomcat, y ése no se ha tocado en absoluto (antes que tocarlo escojo muerte). Pero es un buen intento ;)

    #  Lek 30 de September, 2008

  5. En Weblogic, al menos hasta la versión 8.1, sucede lo mismo. Ese mismo parámetro hay que incluirlo en el arranque que Weblogic por ejemplo si en una aplicación J2EE usamos alguna clase de awt. Por ejemplo, algunos servlets captcha usan awt para generar la imagen, y sin esa opción en el arranque del servidor no funcionan.

    #  CNG 20 de November, 2009

Escribe un comentario