web-dev-qa-db-ger.com

eclipse/Tomcat: deploy funktioniert nicht mehr (ClassNotFoundException)

Ich verwende Eclipse Helios Service Release 1 mit Tomcat 7.0.12 unter Linux Ubuntu Natty Narwhal.

Ich war glücklich, meine Webapps neu zu implementieren, bis sie aus scheinbar keinem Grund aufhörte. Die folgende Ausnahme wird angezeigt:

SEVERE: Allocate exception for servlet Index
Java.lang.ClassNotFoundException: obliquid.servlet.Index
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1676)
    at org.Apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.Java:1521)
  • Auf der Registerkarte Servers habe ich "Tomcat v7.0 Server unter localhost [Started, Synchronized]
  • Mein Projekt wird als Kind von Tomcat v7.0 Server angezeigt
  • In Eigenschaften, Java-Erstellungspfad, Quelle habe ich Project/src Quellordner
  • In Eigenschaften, Web Deployment Assembly habe ich die folgenden Zuordnungen: / WebContent -> /, / src -> / WEB-INF/classes, / test -> / build/classes
  • Mein src Verzeichnis enthält ein Servlet in obliquid/servlet/Index.Java
  • Ich habe bereits versucht, auf Clean Module Work Directory zu klicken ... und Publish.
  • Ich habe versucht, den Server auf der Registerkarte Eclipse Servers zu stoppen und zu starten

Was sollte ich noch prüfen? Vielen Dank.

UPDATEObwohl ich jetzt mit dem neuen Projekt arbeite, bin ich zurückgekommen, um das alte zu überprüfen, und auf mysteriöse Weise funktioniert es jetzt. Ich denke, ich werde nicht finden können, was passiert ist. 

Heute jedoch hatte ich mit dem neuen Projekt 404 Fehler ohne ersichtlichen Grund. Ich fand heraus, dass ein Rechtsklick auf den Tomcat-Server und das Auswählen von "Bereinigen ..." nützlich sein können. Vielleicht hätte es helfen können.

Wenn Sie "Bereinigen ..." auswählen, wird Folgendes angezeigt: "Bei der Bereinigung werden alle Veröffentlichungszustände gelöscht und neu erstellt. Möchten Sie wirklich alle veröffentlichten Ressourcen bereinigen?". Ja, ich habe das Problem gelöst

UPDATE 2 Beim neuen Projekt ist es wieder passiert. 404 Fehler, diesmal gehen sie nicht weg.

Stop -> Clean... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Start (404)
Stop -> Clean Tomcat Work Directory... -> Clean... -> Start (404)
Stop -> Remove on the application ->  Clean... -> Run As -> Run on Server -> (404)  
Exit Eclipse, Start Eclipse
Start the server -> (404)

UPDATE 3 Es stellte sich heraus, dass ich diesmal gerade keine Ausnahme bemerkte, die durch eine Listener-Klasse beim Start verursacht wurde. Nachdem das Problem gelöst war, funktionierte es. Ich denke, ich sollte um 3 Uhr morgens aufhören zu arbeiten.

22
stivlo

Bei Tomcat 6 und Eclipse Ganymede fand ich die folgende Kette heraus, die wie ein Zauber wirkt:

1 Server stoppen

2 Projekt -> sauber

3 Projektaufbau (ich hatte den automatischen Aufbau deaktiviert)

4 Server löschen

5 Server-Ordner löschen

6 Starten Sie Eclipse erneut

7 Neuen Server erstellen, Projekt hinzufügen und starten :)

dauert einige Zeit, arbeitete aber wie charmant. Mein Problem war ein irritierendes Startproblem beim Listener, aber es scheint etwas Ähnliches zu sein: eine Eigenschaft bei Tomcat. Btw: Heutzutage bin ich auch ein großer Glassfish-Fan.

36
mico

Ich habe festgestellt, dass dieses Verfahren nützlich ist:

  • Klicken Sie auf die Registerkarte Servers und stoppen Sie den verwendeten Server, falls er ausgeführt wird
  • Klicken Sie erneut mit der rechten Maustaste auf den Server und wählen Sie Clean ...
  • Klicken Sie erneut mit der rechten Maustaste und wählen Sie Clean Tomcat Work Directory ...

Hoffentlich sollte die ClassNotFoundException jetzt verschwunden sein.

Ein anderes Mal hatte ich ein Problem mit einer Klasse, die beim Serverstart gestartet wurde, eine Ausnahme in einer Listener-Klasse (ServletContextListener). Wenn ein ServletContextListener während des Startens eine Ausnahme auslöst, wird die Anwendungsbereitstellung abgebrochen, daher die 404-Fehler. In diesem Fall löste die Anwendung das Problem, durch das die Ausnahme verursacht wurde, erneut.

EDIT: Diese kürzere Prozedur funktionierte meistens für mich, aber heute funktionierte es nicht und ich musste der erweiterten Prozedur von Mico folgen. Mein Vorschlag ist, wenn Sie ein ähnliches Problem haben, versuchen Sie zuerst dieses kürzere Verfahren. Wenn das Problem weiterhin besteht, versuchen Sie es mit Mico.

12
stivlo

Ich würde empfehlen, den Tomcat-Server erneut anzuhalten und zu starten. Hot Deploy funktioniert nicht für immer. Es gibt einige Probleme, die dazu führen, dass Sie nach einigen Neuinstallationen neu starten müssen.

2
duffymo

Ich frage mich, wann ich die akzeptierte Antwort mit +25 sehe ist es wirklich genau ?

Zuerst, wenn Sie den Server löschen, was ist der Punkt bei der Reinigung? Es wird deine Zeit unnötig dauern und nichts Nützliches wirst du gewinnen.

Also werde ich sagen, nur 5, 6, 7 Schritte sollten die Magie tun

5 Server-Ordner löschen

6 Starten Sie Eclipse erneut

7 Neuen Server erstellen, Projekt hinzufügen und starten

Dies könnte etwas sein, das ich auf con-fess 2011 gelernt habe. Für mich klingt das nach einem Classloader-Problem.

Die Theorie dahinter:

  • Java verwendet nicht nur den Typ der Klasse, sondern auch den Classloader, mit dem der Typ geladen wurde, um den Typ einer Instanz zu identifizieren. Dies bedeutet, dass eine einfache Operation fehlschlagen könnte, z.

    ClassA a1 = new a1; ClassA a2 = SomeOtherClass.giveMeInstanceOfA (); A1 = a2;

Dieses Beispiel schlägt fehl, wenn SomeOtherClass einen anderen Classloader verwendet, da Java sagen würde, dass sie nicht identisch sind.

  • Der Sprecher erwähnte auch, dass einige Server standardmäßig etwa 45 verschiedene Classloader verwenden.

Was bedeutet das in der Praxis:

Sie stellen Ihre Webapp auf dem Server bereit, alles läuft einwandfrei. Der Server speichert die Klassen und alles, was er benötigt, um sie irgendwo zu laden. Jetzt erstellen Sie ein heißes Bereitstellungsprogramm, und der Server lädt möglicherweise neue Klassen mit einem neuen (oder einem anderen) Klassenladeprogramm. Dies ist der Punkt, an dem es gefährlich wird, weil Sie nun zwei verschiedene Klassen im Speicher haben, die gleich sein sollten. Einfache Operationen wie Umsetzungen (ClassA a = (ClassA) new ClassA ()) schlagen fehl, neue Methoden innerhalb der Klasse werden nicht gefunden (da der Server eine zwischengespeicherte Version ohne diese Methode verwendet),.

Dies ist der Punkt, an dem ich den Server neu starte, das Arbeitsverzeichnis bereinigt (um die zwischengespeicherten Versionen zu entfernen) und anfange, Hot Deployment als kritisch zu betrachten.

Wenn es möglich ist, das Verfahren von Mikkos auszuprobieren, um das Problem zu lösen, kann Ihnen diese Erklärung helfen, den Grund dafür zu verstehen.

Ich weiß, dass dies Ihr Problem nicht löst, könnte Ihnen jedoch einige Hinweise geben, was möglicherweise passiert sein könnte.

1
monty

Ich habe neue Erfahrungen mit dem Programmieren gesammelt und bin nicht mehr an der Kombination Eclipse + Tomcat verhungert. Verschiedene Möglichkeiten können Ihnen dabei helfen, diese Kombination zu verwenden:

Verwenden Sie sie zuerst nicht zusammen!

  • Sie können andere verfügbare IDEs verwenden, z. IntellijIdea (das ist nicht kostenlos, aber lohnt sich zu investieren) hat die Eigenschaft, dass Sie beim Debuggen eines Java-Codes den Code im laufenden Betrieb ändern und die Java-Dateien einzeln kompilieren können auf dem Server aktualisiert. Es ist fast nie ein Neustart erforderlich (natürlich geht es manchmal verloren, aber hauptsächlich funktioniert es).

  • Verwenden Sie einen Standalone-Tomcat-Server, nicht den in Eclipse/Ihrer IDE. Der erste Trick funktioniert nur, wenn Sie einen externen Server debuggen, nichts in der IDE. Der zweite Tipp: Wenn Sie nur den Inhalt von jsp oder html ändern, können diese Dateien mit dem Befehl unix cp oder windows copy manuell an die richtige Stelle im webapp-Ordner von Tomcat kopiert werden können Sie den Ordnerinhalt (z. B. meinOrdner/*. jsp) beliebig oft kopieren und es ist kein Neustart erforderlich. Die Änderungen werden sichtbar, wenn Sie die Datei web.xml im Ordner webapps berühren oder bearbeiten und speichern und anschließend die sichtbare Seite im Browser aktualisieren. Wahrscheinlich ist das Auffrischen mit STRG + F5 der beste Weg.

Danke an @Verdan für seinen Kommentar, sonst wäre ich nicht wieder gekommen, um zu antworten.

1
mico

Ich habe momentan mit dem gleichen Problem zu kämpfen, aber nichts, was hier erwähnt wird, hilft mir nicht. Wie auch immer, ich habe das herausgefunden, wenn ich: 

  1. server in Eclipse stoppen
  2. tomcat woanders ausführen (in meinem Fall die Xamp-Distribution)
  3. stoppen Sie derzeit, Tomcat auszuführen 
  4. starten Sie Tomcat in Eclipse

alles funktioniert gut, natürlich bis ich etwas im Code ändere und versuche, es erneut zu testen. 

0
vanomart

Ich konnte dieses Problem lösen, indem ich die Maven-Natur deaktiviere (Rechtsklick auf Projekt >> Maven >> Maven-Natur deaktivieren). Aktivieren Sie es dann erneut (klicken Sie mit der rechten Maustaste auf Projekt >> Konfigurieren >> In Maven-Projekt konvertieren). Ich hatte alle anderen Tipps und Tricks ausprobiert, aber das ist der, der endlich funktioniert hat.

0
Bobby King

Apropos Hotcat-Bereitstellung von Tomcat: In der Tat treten verschiedene Probleme auf, von denen das geringste Speicherverlust ist. Deshalb müssen Sie die Anwendung neu starten. Ich würde empfehlen, JRebel für eine schnelle Umstellung von "Änderungen vornehmen und speichern und dann den Browser aktualisieren und die Änderungen sofort sehen" zu empfehlen. Sie finden das JRebel-Praktikum, das zeigt, wie es mit Tomcat und Eclipse verwendet wird. http://www.javapassion.com/rebels/jrebel_basics/

0
Sang Shin

Ich hatte das gleiche Problem - ich versuchte alle oben genannten Punkte. Eclipse stoppte immer, wenn ich versuchte, den Server zu starten, selbst nachdem ich alle Server-Konfigurationen gelöscht und eine neue mit einer frisch heruntergeladenen Tomcat-Instanz erstellt hatte. Wie auch immer, das Problem wurde nicht gelöst, bis ich zu einem neuen Arbeitsbereich gezogen bin, die Projekte erneut importiert und einen neuen Server erstellt habe. Scheint mir wie ein Eclipse-Bug ... Wenn also nichts anderes funktioniert, ist dies der richtige Weg ...

0
user871784