2009-06-04 16 views
6

Tengo una aplicación que se ejecuta en tomcat, uno de los métodos es crear una miniatura simple a partir de una imagen jpeg. Las funciones funcionan bien fuera de línea y hace una semana también en Tomcat. Pero ahora me sale el siguiente error:NoClassDefFoundError al acceder a GraphicsEnvironment.getLocalGraphicsEnvironment en Tomcat

java.lang.NoClassDefFoundError 
java.lang.Class.forName0(Native Method) 
java.lang.Class.forName(Class.java:164) 
java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment(GraphicsEnvironment.java:68) 
java.awt.image.BufferedImage.createGraphics(BufferedImage.java:1141) 
eval.impl.ImageEval.getThumbnail(ImageEval.java:155) 
eval.impl.ImageServlet.doGet(ImageServlet.java:79) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 

No creo que tengo cambia nada lo que debería influir en este (en realidad no cambió la función del todo de acuerdo con el repositorio SVN), por lo que debe ser un problema de biblioteca. Pero no puedo entender lo que falta. Aquí están las líneas reales de la función getThumbnail, donde occures el error:

 BufferedImage thumbImage = new BufferedImage(thumbWidth, 
      thumbHeight, BufferedImage.TYPE_INT_RGB); 
    Graphics2D graphics2D = thumbImage.createGraphics(); 
    graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION, 
      RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
    graphics2D.drawImage(simage, 0, 0, thumbWidth, thumbHeight, null); 

[editar] decidí actualizar la descripción del problema un poco. Sí, parece que no puede encontrar alguna clase de java.awt o una relacionada con eso. Pero existen en el servidor en el jvm. El modo sin cabeza Java no resuelve el problema. En otro proyecto, el mismo código exacto, pero dentro de un servidor web axis2 en este servidor funciona bien. [/ edit]

+4

No tiene ninguna clase. – user105033

+0

¿Se está ejecutando en modo sin cabeza? –

+1

La stacktrace debe contener el nombre de la clase faltante, ¿no es así? –

Respuesta

6

Parece que ha cambiado la configuración de Tomcat.

O ha cambiado a un cuadro l {0,1} [iu] n [iu] x o está instalado en una máquina virtual con un control de seguridad diferente al que lo prueba.

Al parecer, el

GraphicsEnvironment.getLocalGraphicsEnvironment() 

está tratando de acceder a la propiedad: java.awt.graphicsenv

Qué puede devolver nombre de clase existente no nula o alguna que luego se carga y se lanza la ClassNotFoundException. 1

La solución parece estar especificando la propiedad "java.awt.headless".

Ésta es una pregunta similar: java.awt.Color error

probar este search, muestra situaciones similares como el.

Recuerdo que también había algo en la base de datos de bichos dom.

¡Publique la solución cuando la encuentre!

1. GraphicsEnvironment.java

EDITAR

No se eclipsa !!

En mi publicación original hay un enlace al código fuente de la clase que arroja la excepción.

Ya que parece que se olvida de ella, voy a publicar aquí para usted:

 public static synchronized GraphicsEnvironment getLocalGraphicsEnvironment() { 
      if (localEnv == null) { 
       // Y O U R E R R O R O R I G I N A T E S H E R E !!! 
       String nm = (String) java.security.AccessController.doPrivileged 
        (new sun.security.action.GetPropertyAction 
        ("java.awt.graphicsenv", null)); 

       try { 
    //      long t0 = System.currentTimeMillis(); 
        localEnv = 
         (GraphicsEnvironment) Class.forName(nm).newInstance(); 
    //    long t1 = System.currentTimeMillis(); 
    //    System.out.println("GE creation took " + (t1-t0)+ "ms."); 
        if (isHeadless()) { 
         localEnv = new HeadlessGraphicsEnvironment(localEnv); 
        } 
       } catch (ClassNotFoundException e) { 
        throw new Error("Could not find class: "+nm); 
       } catch (InstantiationException e) { 
        throw new Error("Could not instantiate Graphics Environment: " 
            + nm); 
       } catch (IllegalAccessException e) { 
        throw new Error ("Could not access Graphics Environment: " 
            + nm); 
       } 
      } 

      return localEnv; 
     } 

Eso es lo que se ejecuta.

Y en el post original que parece que no han leído, he dicho código está accediendo a la propiedad "java.awt.graphicsenv"

Si ese otro proyecto usando eje no tiene el mismo problema puede ser porque puede estar ejecutándose en una configuración de tomcat diferente o la biblioteca de ejes permitió el acceso a esa propiedad. Pero no podemos estar seguros. Eso es pura especulación. Entonces, ¿por qué no probar la siguiente y ver lo que se imprime:

 String nm = (String) java.security.AccessController.doPrivileged 
      (new sun.security.action.GetPropertyAction 
      ("java.awt.graphicsenv", null)); 

    System.out.println("java.awt.graphicsenv = " + nm); 

Se imprime nula entonces ahora cuál es el problema. No tiene esa propiedad en su sistema, o la seguridad le prohíbe usarla.

Es muy difícil de decir desde aquí: "Ir y editar el archivo xyz y agregar: fail = false" Así que tienes que hacer tu trabajo y tratar de averiguar cuál es el verdadero motivo.

Comience investigando cuál es el código que se está ejecutando (que acabo de publicar) y siga por lo que hace y cómo funciona todo "AccessController.doPrivileged". (Puede usar Google + StackOverflow para eso).

+0

No, eso no es todo. De hecho, me olvidé de mencionar esto, pero no es realmente importante, en otro proyecto donde se despliega un servicio web con axis2 esta función funciona, en el mismo servidor Tomcat 5.5. Todavía probé el modo sin cabeza, no cambió nada. El tomcat es el mismo que hace una semana, solo puedo suponer que algo en eclipse (no el código) ha cambiado, porque no hay otra posible expansión, pero aún no puedo encontrar una solución. – Red33mer

+0

Eso arrojaría un error, no un NoClassDefFoundError, que es una subclase. E informaría el nombre de la clase que estaba buscando. – Yishai

+0

@Yishai: Excepto si NoClassDefFoundError se arroja a puñetazo, ¿verdad? La sección catch maneja 3 Exception pero no es un error (porque no deberían manejarse en primer lugar) Si NoClassDefFoundError se lanza, no se manejará en el try/catch y aparecerá en la pila stacktracker (tal como informa Red33mer) NoClassDefFoundError ! = NoClassDefFoundException. http://bit.ly/ncdfe! = Http://bit.ly/cnfep – OscarRyz

1

¿Este servidor está ejecutando Java en modo servidor? He oído que no se carga en las clases AWT.

+0

No, no es eso, hace una semana funcionó. La configuración de tomcat no ha cambiado desde entonces. Creo que ves por qué este error me deja perplejo. – Red33mer

+0

Hmm, tenía una actualización del sistema operativo - ¿nueva versión de drivers x.org o nvidia/intel/ati linux? Veo ese método nativo en el stacktrace ... – JeeBee

+0

No, no tuve una actualización de Os. – Red33mer

3

fue funcionando hace una semana, y ahora no lo es.

POR LO TANTO, HA CAMBIADO ALGO ENTRE "trabajo" y "no funciona".

Regrese a la configuración de trabajo (si puede) y haga un seguimiento riguroso de lo que ha cambiado. Si no tienes una copia de seguridad de la configuración de trabajo, revisa meticulosamente lo que has hecho entre trabajar y no trabajar hasta que encuentres lo que cambiaste.

Puede que no sea de código - que podría ser un archivo de configuración, etc.

mejor de la suerte,

-R

+0

Sí, lo tengo, algo ha cambiado, aún así, comprobé una versión anterior del svn, todavía no funcionaba, la configuración de tomcat no se ha modificado o incluso modificado desde entonces. Esta es realmente la razón por la que hago esta pregunta, porque, francamente, no puedo explicar esto. – Red33mer

1

Si va a implementar esto en * nix, y usted don' Ya tengo un sistema de ventanas X funcionando, eso podría explicarlo. Incluso si lo hace, si no está exportando la variable del sistema DISPLAY al proceso que inicia la JVM, o si lo está pero no es realmente válido, podría causar tal problema.

Eso al menos explicaría por qué no cambió ninguna configuración en tomcat, pero todavía tiene un problema.

+0

En realidad tengo exactamente la misma función en otro proyecto implementado en este tomcat, que está utilizando axis2 en su lugar, y está funcionando. Pero si se tratara de un problema de variable del sistema DISPLAY, tampoco debería funcionar. Realmente creo que el eclipse arruinó algo, porque no veo ninguna otra explicación posible. – Red33mer

0

Si su NoClassDefFoundError no tiene ningún mensaje en absoluto, entonces esto significa dos cosas:

  1. La JVM ya se intentó y no pudo cargar una clase. Generalmente, esto significa que la JVM no pudo completar la inicialización estática para esa clase, es decir, asignar valores a cualquier campo static y ejecutar cualquier static { } bloques. A menudo, esto se debe a que faltan las clases necesarias para realizar esta inicialización estática.
  2. Está utilizando Java 5, no Java 6.(En Java 6, se obtiene un mensaje 'No se pudo inicializar la clase xyz' en su lugar.) Clase

El problema parece ser la persona cuyo nombre es el valor de la propiedad del sistema java.awt.graphicsenv. Comenzaría por descubrir el valor de esta propiedad. ¿Qué sucede cuando intentas crear una instancia de esta clase?

4

Tuvimos un problema similar y después de muchos problemas se identificó que estaba relacionado con la propiedad java.awt.headless. El problema se resolvió estableciendo explícitamente la opción de JVM a

-Djava.awt.headless=true 
0

Puesto que usted está recibiendo NoClassDefFoundError desde dentro del código AWT, parece que Java está fallando para cargar las bibliotecas de X Windows. Tenga en cuenta que incluso si está ejecutando en modo headless ($ DISPLAY no apunta a un servidor X Windows), AWT aún necesita algún subconjunto de las bibliotecas X11 para generar imágenes. Véase, por ejemplo, esta referencia:

http://javatechniques.com/blog/linux-x11-libraries-for-headless-mode

Si algo dejó de funcionar y su código de Java no ha cambiado, es posible que las librerías X11 tuvimos que cambiar o desinstalar en su máquina, o que por alguna otra razón su variable de entorno LD_LIBRARY_PATH ya no los señala.

Cuestiones relacionadas