ClassNotFoundException DispatcherServlet all’avvio di Tomcat (dipendenze Maven non copiate in wtpwebapps)

Mi sono imbattuto in questo problema alcune volte e mi sono imbattuto in una soluzione (semi) affidabile, quindi ho pensato di postarlo qui nel caso in cui aiuti qualcun altro, o nel caso lo dimentichi, e anche di chiedere se qualcuno ha idea di quale sia la causa sottostante e perché la mia correzione funzioni.

Il problema: ho una webapp di spring 3 che voglio utilizzare l’opzione Esegui su server in Eclipse per l’esecuzione su un server Tomcat 7. Con alcuni progetti questo funziona, ma alcuni sembrano entrare in uno stato di errore in cui ogni volta che il server si avvia ottengo una class non trovata: org.springframework.web.servlet.DispatcherServlet.

Dopo alcune indagini, ho scoperto che le dipendenze del maven del progetto non erano state copiate su WEB-INF/lib in ${PROJECT_LOCATION}/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/

Ho provato un sacco di cose prima di notare che il progetto aveva un avvertimento nel pannello Problemi:

 Classpath entry org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER will not be exported or published. Runtime ClassNotFoundExceptions may result. 

Forse avrei dovuto notarlo prima.

In ogni caso, selezionando questo ed eseguendo la “Correzione rapida” risolve il problema e posso gestire felicemente il mio progetto. La soluzione rapida è: “Contrassegnare la voce classpath raw associata come dipendenza di pubblicazione / esportazione”.

Il problema è che, sebbene funzioni, non so cosa significhi. Non riesco a vedere nessun cambiamento evidente nella configurazione del mio progetto dopo che è stato fatto. Mi piacerebbe sapere qual è il vero problema e se posso evitare che accada di nuovo. Vorrei anche sapere se c’è qualcosa che avrei potuto fare io stesso (oltre a eseguire la correzione rapida) che l’avrei risolto, perché mi sembra di aver provato praticamente tutto il resto.

Grazie per l’aiuto.

Dai un’occhiata alla sezione “Assemblaggio di implementazione” sotto le proprietà del progetto. Il contenuto di questa pagina specifica come il tuo progetto deve essere assemblato in un’applicazione in esecuzione. In particolare, questo è il posto in cui è ansible controllare quale delle librerie a cui fa riferimento il tuo progetto, deve essere inclusa nel pacchetto. Selezionare Aggiungi -> Voci del percorso di costruzione Java. Sarà ansible scegliere tra le voci del percorso di generazione esistenti da includere nell’assembly.

La soluzione rapida trovata ha fatto la stessa cosa per te. Se sei curioso di sapere cosa succede sotto le copertine, dai un’occhiata al file .classpath prima e dopo la soluzione rapida. La correzione rapida etichetta la voce classpath con alcune informazioni sull’assembly.

Controllare il file .class e sostituire la seguente voce

 **** 

con sotto: –

 **    ** 

Ha funzionato per me.

Sembra, devi anche installare Maven Integration per il plugin WTP . La sua descrizione può essere trovata su issues.sonatype.org .

Mi sono imbattuto in questo problema oggi, in un progetto che ha funzionato da molto tempo. Ho provato tutte le soluzioni di cui sopra, ma (1) non ho visto l’avviso nel pannello Problemi come aveva fatto il poster; (2) le voci Java Build Path del Deployment Assembly non mostravano altro disponibile per la distribuzione; (3) la voce .classpath per org.eclipse.jst.component.dependency era già lì; e (4) avevo già installato Maven Integration per WTP. Ho finalmente rimosso il mio progetto dal server Tomcat e poi lo ho ridistribuito e il problema è scomparso.