2014-10-13 6 views
6

Sto sviluppando un'applicazione GWT. Sta usando RPC per raccogliere informazioni da un sistema interno. Lo fa usando un contenitore di libreria, chiamiamolo alpha.jar. Stiamo usando questo jar in molte applicazioni in modo che funzioni bene e sia costruito con ANT, all'esterno di eclissi.eccezione non prevista: java.lang.NoClassDefFoundError: org/apache/log4j/LogManager

Alcune classi nei riferimenti alpha.jar LOG4J2 e anche molti altri vasi esterni, quindi quando eseguiamo un'applicazione passiamo un classpath a tutti quelli e tutto funziona perfettamente. Si prega di notare che questo non è un semplice problema per principianti. Alpha.jar funziona come dovrebbe, comprese le chiamate a Log4J.

Il problema:

In Eclipse, ho questo progetto di applicazione GWT e anche il progetto Alpha.jar (con il codice sorgente, ovviamente). La parte server deve instaziare gli oggetti alfa e comunicare al sistema alfa.

Quando si esegue questa operazione in GWT aggiungendo un riferimento percorso build al progetto Alpha, la mia app GWT funziona correttamente.

Quando al posto del riferimento del progetto includo (in war/WEB-INF/lib) il alpha.jar ed eseguo l'app, ottengo l'errore nel titolo la prima volta che istanziamo una classe da alpha.jar.

Non ci sono peculiarità nel modo in cui viene costruito alpha.jar, quindi in pratica dovrebbe essere la stessa cosa del progetto in eclissi, giusto?

notare quanto segue:

*) vasi dipendenti del alpha.jar sono anche in guerra/WEB-INF/lib. log4j2-core, log4j-api e molti altri (apache common ad esempio)

*) Se rimuovo alpha.jar (e il codice che lo chiama) e invece aggiungo semplicemente il codice che ha chiamato LOG4J2, quel codice funziona anche bene!

Come mai ottengo questo strano errore quando uso il JAR ?? Nota anche NoClassDefFoundError, non è la più comune ClassNotFoundException. Pls see What causes and what are the differences between NoClassDefFoundError and ClassNotFoundException?

Se hai bisogno di maggiori informazioni fammi sapere.

+0

Potete fornire il proprio script di build ... probabilmente si sta perdendo una dipendenza Log4J necessario effettuare il login messaggi. E controlla il tuo Java runtime/SDK in Eclipse e Ant (dovrebbe essere lo stesso) – Drejc

+0

No, non mi manca una dipendenza. Per favore, leggi di nuovo la domanda. –

+0

Scusa ma dalla descrizione del tuo problema non sono in grado di capire cosa stai facendo esattamente e dove si trova il problema - quindi nessuno ha risposto alla tua domanda finora. – Drejc

risposta

8

org.apache.log4j.LogManager è una classe da log4j 1.2 (non log4j2).

Pertanto, uno dei barattoli della tua app Web deve fare riferimento a esso. Il colpevole dovrebbe essere visibile nella traccia dello stack.

A seconda delle circostanze, è possibile aggiungere semplicemente un jar log4j 1.2 all'app Web poiché le due versioni sono completamente indipendenti l'una dall'altra.

+0

I suoni sono molto promettenti, mi mancava il fatto che dicesse log4j e non log4j2! Posso aggiungere 1.2 (ma vorrei evitarlo). Come posso scoprire quale JAR fa riferimento a 1.2 ?? Nelle altre app non GWT, la nostra directory "lib" contiene solo log4j2-core.jar e log4j-api.jar e non ottengo questa eccezione lì? E perché non vedo questo problema quando si utilizza il riferimento di progetto in Eclipse, non sto certamente usando 1.2 ovunque. –

+0

Potresti volerlo vedere di nuovo ... –

0

Se si dispone di uso log4j 2 si prega di non dimenticare di assegnare un nome al log4 J2 XML invece di log4j.xml