2009-06-04 16 views
6

Ho un'applicazione che è in esecuzione su tomcat, uno dei metodi è, creando una semplice anteprima da un'immagine jpeg. Le funzioni funzionano bene offline e una settimana fa anche su tomcat. Ma ora ottengo il seguente errore:NoClassDefFoundError durante l'accesso a GraphicsEnvironment.getLocalGraphicsEnvironment su 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) 

Non penso che ho cambiato nulla quello che dovrebbe influenzare questo (effettivamente non ho cambiato la funzione, a secondo il repository SVN), quindi deve essere un problema di biblioteca Ma non riesco a capire cosa manca. Qui ci sono le linee reali dalla funzione di getThumbnail, dove l'errore occures:

 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); 

[modifica] Ho deciso di aggiornare la descrizione del problema un po '. Sì, sembra che non riesca a trovare qualche classe da java.awt o da una relativa. Ma esistono sul server nella jvm. La modalità headless di Java non risolve il problema. In un altro progetto lo stesso codice esatto, ma all'interno di un servizio web asse2 su questo server funziona correttamente. [/ edit]

+4

Non hai classe. – user105033

+0

È in esecuzione in modalità headless? –

+1

Lo stacktrace dovrebbe contenere il nome della classe mancante - non è vero? –

risposta

6

Sembra che tu abbia modificato la configurazione di Tomcat.

O è stato modificato in l {0,1} [iu] n [iu] x box o installato su una macchina virtuale con controllo di sicurezza diverso da quello in cui viene testato.

A quanto pare il

GraphicsEnvironment.getLocalGraphicsEnvironment() 

sta tentando di accedere alla proprietà: java.awt.graphicsenv

Quale può restituire nulla o qualche nome classe non esistente che viene poi caricato e getta la ClassNotFoundException. 1

La soluzione sembra essere specificando la proprietà "java.awt.headless".

Questa è una domanda simile: java.awt.Color error

Prova questa search, mostra situazioni simili come la tua.

Ricordo che c'era anche qualcosa nel database degli errori del sole.

Posta la soluzione quando la trovi!

1. GraphicsEnvironment.java

EDIT

Non è eclissi !!

Nel mio post originale c'è un collegamento al codice sorgente della classe che sta lanciando l'eccezione.

Dal momento che sembra che non te ne accorgi, Vi posto qui per voi:

 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; 
     } 

Questo è quello che viene eseguito.

E nel post originale, che non sembrano avere letto, ho detto il codice accede alla proprietà "java.awt.graphicsenv"

Se il primo progetto che utilizza l'asse non ha lo stesso problema potrebbe essere perché potrebbe essere in esecuzione in una configurazione tomcat diversa o la libreria degli assi consentiva l'accesso a tale proprietà. Ma non possiamo essere sicuri. Questa è pura speculazione. Allora perché non si prova la seguente e vedere ciò che viene stampato:

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

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

Esso viene stampato nulla allora ora qual è il problema. Non hai quella proprietà nel tuo sistema, o la sicurezza ti impedisce di usarla.

È molto difficile dirti da qui: "Vai e modifica file xyz e aggiungi: fail = false" Quindi devi fare il tuo lavoro e cercare di capire qual è il vero motivo.

Inizia facendo ricerche su quale codice viene eseguito (che ho appena pubblicato) e segui comprendendo cosa fa e come funziona tutto ciò che "AccessController.doPrivileged" funziona. (Puoi utilizzare Google + StackOverflow per questo).

+0

No, non è quello. In realtà ho dimenticato di dirlo, ma non è molto importante, in un altro progetto in cui un servizio web è distribuito con axis2 questa funzione funziona, sullo stesso server tomcat 5.5. Ho ancora provato la modalità senza testa, non ha cambiato nulla. Il tomcat è lo stesso di una settimana fa, posso solo supporre che qualcosa in eclissi (non nel codice) sia cambiato, perché non c'è altra possibile esplicazione, ma ancora non riesco a capire una soluzione. – Red33mer

+0

Questo genererebbe un errore, non un NoClassDefFoundError, che è una sottoclasse. E riporterebbe il nome della classe che stava cercando. – Yishai

+0

@Yishai: Tranne se NoClassDefFoundError è stato gettato a destra? La sezione catch gestisce 3 Exception ma non un errore (perché non dovrebbero essere gestiti al primo posto) Se viene lanciato NoClassDefFoundError, non verrà gestito nel try/catch e comparirà nello stacktrace (come riportato da Red33mer) NoClassDefFoundError ! = NoClassDefFoundException. http://bit.ly/ncdfe! = Http://bit.ly/cnfep – OscarRyz

1

Questo server esegue java in modalità server - Ho sentito che non viene caricato nelle classi AWT.

+0

No, non è così, una settimana fa ha funzionato. La configurazione di tomcat non è stata modificata da allora. Penso che tu capisca perché questo errore mi sta confondendo. – Red33mer

+0

Hmm, ha avuto un aggiornamento del sistema operativo - nuova versione dei driver x.org o nvidia/intel/ati linux? Vedo quel metodo nativo nello stacktrace ... – JeeBee

+0

No, non ho avuto un aggiornamento Os. – Red33mer

3

era in esecuzione una settimana fa, e ora non lo è.

QUINDI, SEI CAMBIATO QUALCOSA TRA "lavoro" e "non lavoro".

Torna alla configurazione di lavoro (se puoi), e controlla rigorosamente ciò che hai modificato. Se non disponi di un backup della configurazione di lavoro, ripercorri meticolosamente ciò che hai fatto tra il lavoro e il non lavoro finché non trovi ciò che hai cambiato.

Potrebbe non essere il codice - potrebbe essere un file di configurazione, ecc

Buona fortuna,

-R

+0

Sì, ho capito, qualcosa è cambiato, ancora, ho controllato una vecchia versione dalla svn, ancora non funzionante, la configurazione del tomcat non è stata modificata o nemmeno toccata da allora. Questo è in realtà il motivo per cui sto facendo questa domanda, perché, francamente, non posso spiegarlo. – Red33mer

1

Se si distribuisce questo su * nix, e si don' Ho un sistema X window in esecuzione, che potrebbe spiegarlo. Anche se lo fai, se non stai esportando la variabile di sistema DISPLAY nel processo che avvia la JVM, o se sei ma non è effettivamente valido, potrebbe causare un tale problema.

Questo spiegherebbe almeno il motivo per cui non è stata modificata alcuna configurazione in tomcat, ma il problema persiste.

+0

In realtà ho la stessa identica funzione in un altro progetto distribuito su questo tomcat, che utilizza invece axis2 e funziona. Ma se fosse un problema con la variabile di sistema DISPLAY, dovrebbe funzionare anche. Penso davvero che Eclipse abbia rovinato qualcosa, perché non vedo altre spiegazioni possibili. – Red33mer

0

Se il NoClassDefFoundError ha alcun messaggio a tutti, allora questo significa due cose:

  1. La JVM è già provato e fallito per caricare una classe. Di solito, ciò significa che la JVM non è stata in grado di completare l'inizializzazione statica per quella classe, cioè assegnare valori a qualsiasi campo static ed eseguire qualsiasi blocco static { }. Spesso, questo è dovuto al fatto che mancano le classi necessarie per eseguire questa inizializzazione statica.
  2. Stai utilizzando Java 5, non Java 6.(In Java 6, si ottiene un messaggio 'Impossibile inizializzare classe xyz' invece.) Classe

Il problema sembra essere quello il cui nome è il valore della proprietà di sistema java.awt.graphicsenv. Vorrei iniziare scoprendo il valore di questa proprietà. Cosa succede quando provi a creare un'istanza di questa classe?

4

Abbiamo riscontrato un problema simile e, dopo molti problemi, è stato identificato che era correlato alla proprietà java.awt.headless. Il problema è stato risolto impostando in modo esplicito l'opzione JVM per

-Djava.awt.headless=true 
0

Dal momento che stai ricevendo NoClassDefFoundError dall'interno del codice di AWT, sembra che Java non riesce a caricare le librerie X Windows. Nota che anche se stai eseguendo la modalità headless ($ DISPLAY che non punta a un server X Windows), AWT ha ancora bisogno di un qualche sottoinsieme delle librerie X11 per il rendering delle immagini. Si veda, per esempio, questo riferimento:

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

Se qualcosa ha smesso di funzionare e il codice Java non è cambiata, è possibile che le librerie X11 siamo spostati o disinstallati sulla vostra macchina, o che per qualche altra ragione la variabile di ambiente LD_LIBRARY_PATH non punta più a loro.

Problemi correlati