Tomcat neu starten, wenn eine Klassendatei geändert wird?
Warum brauchen wir, um starten Sie den tomcat-server, wenn eine Klasse-Datei geändert wird, gibt es keine andere Möglichkeit?
InformationsquelleAutor der Frage flash | 2009-12-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie Tomcat konfigurieren und machen Sie Ihre webapp "wiederaufladbar". Dazu fügen Sie
reloadable=true
zu den<Context>
element Ihrer webapp. Über diereloadable
Attribut, das Dokumentation sagt:InformationsquelleAutor der Antwort Pascal Thivent
Da gibt es mit Sicherheit! Starten Sie Tomcat in Entwicklung-Modus, dann wird jeder webapp wird sich neu auf neu implementiert.
Aus der Tomcat-docs:
...
Gibt es Einstellungen, die Sie ändern können, um anzupassen, was genau Tomcat suchen um nach updates zu suchen. Ich in der Regel die Bereitstellung einzelnen class-Dateien in die entsprechenden Verzeichnisse unter
WEB-INF/classes
und danntouch WEB-INF/web.xml
kick-start einen Neustart der Anwendung; ich denke
web.xml
ist eine der Dateien Tomcat prüft standardmäßig.InformationsquelleAutor der Antwort Carl Smotricz
Auf einer allgemeineren Hinweis, der Grund Sie haben, dies zu tun ist, weil in Java, wenn ein classloader lädt eine Klasse, er kann nicht entladen. Was mit Tomcat zu tun hat, ist ein neuer classloader und laden alle Klassen, die es braucht.
InformationsquelleAutor der Antwort Kelly S. French
Auschecken JRebel.
InformationsquelleAutor der Antwort Greg Mattes
Wenn Sie sich entwickeln, Ihre IDE sollte in der Lage sein zu tun, das transparent auf einem geeigneten server. E. g. die Dynamic Web Project in Eclipse weiß, wie man sprechen zu Tomcat.
Wenn Sie deploy verwenden, erstellen KRIEGES-Dateien und implementieren diese. Tomcat weiß, wie die erneute Bereitstellung einer WAR-Datei.
InformationsquelleAutor der Antwort Thorbjørn Ravn Andersen
Wenn Sie mit war-Dateien bereitstellen, können Sie
autoDeploy=true
in der Tomcat-Konfiguration, die bewirkt, dass Tomcat zu beobachten, die web-root der Anwendung ("webapps" standardmäßig) für neue oder veränderte-war-Dateien. Wenn eine solche Datei gefunden wird, wird es automatisch bereitgestellt.Als Pascal Thivent sagte, obwohl, können Sie die Tomcat-Manager-Anwendung (/manager/html) stoppen, starten, bereitstellen und aufheben der Bereitstellung spezifischer Anwendungen. Wenn die Dateien, die Sie ändern sind in einer bestimmten Anwendung, dies ist ein guter Weg, um Tomcat zu erkennen, die änderungen.
InformationsquelleAutor der Antwort spork
Neben autoDeploy=true in den server.conf , sollten Sie auch vorsichtig sein, nicht, um alle Klassen im shared-classloader. Klassen, die geladen werden durch den shared class loader kann nicht geladen werden.
InformationsquelleAutor der Antwort Nick Hristov
Können Sie tools JRebel. Siehe Beispiel auf meinem blog http://przemek-nowak.pl/2010/10/jrebel-czyli-jak-przyspieszyc-prace-programisty/. Das Beispiel betreffen Tomcat 6.0
InformationsquelleAutor der Antwort Przemek Nowak
Deine Frage nicht wirklich sagen, ob Sie sind besorgt darüber, Ausfallzeiten in der Produktion (d.h. es reduzieren, wird durch das laden der Klassen) oder möchten Sie non-stop-Entwicklung. Also werde ich versuchen zu klären, über die folgenden Punkte:
1) mit
<Context reloadable=true...
in Ihremcatalina.home/conf
Verzeichnis können Sie sicherstellen, dass Ihre Web-App neu geladen, wenn eine andere Klasse wechselt. Können Sie die Ressource ändern watchlist in<WatchedResources>
element.2), Aber dieses lädt dann die Kontext -, re-initialisieren der classloader, leeren Sie den cache, und alles wird sein, als ob die webapplication hat gerade erst begonnen.
Dieser Ansatz wird immer noch verlassen Sie Ihre server unbrauchbar, weil Sie reloaded der Servlet-Kontext. Die wahre "Reload" ist
1) tauschen Sie den byte-code der Klasse, mit einigen Einschränkungen
2) JVM wird wieder die Klasse, wenn "loadClass()" aufgerufen wird, dass classloader.
Dies ist java-Instrumentierung. Sie können schreiben Sie Ihre eigenen Agenten, die Haken können in Ihrer JVM entweder am Anfang oder im Flug. Jedoch, Sie kann nicht definieren, neue Methode, und ändern Sie statischen Variablen. Diese JVM native Einschränkungen (für Oracle HotSpot JVM, die ich kenne). Sie können die Verwendung einer anderen JVM befinden, z.B. DCEVM, die nicht über eine solche Einschränkung. So ist es bis zu Ihnen, wie Sie damit umgehen wollen, Ihr problem. Wenn Sie wissen, was Sie tun (!), Sie können sich mit austauschen von Klassen one-by-one. Und Sie können sogar definieren, die einer "Neuen Klasse", Referenz, Klasse, Objekt/Methode in einer bestehenden/belasteten Klasse und das instrument zum abholen verpasst.
Ich hoffe, das hilft. Alle Antworten hier sind, was Sie benötigen, um Ihre Entscheidung zu treffen.
InformationsquelleAutor der Antwort ha9u63ar