6 Stimmen

Wie kompiliert man einzelne/mehrere Java-Dateien ohne Server-Neustart? Gibt es ein Eclipse-Plugin für das gleiche?

Ich möchte mehrere Java-Dateien in meiner Anwendung kompilieren, ohne Weblogic und Tomcat neu zu starten. Sonst dauert das sehr lange. Hierfür habe ich eine Hotswap-Plugin in Eclipse aber das funktioniert nicht in allen Fällen. Es heißt, es funktioniert bei der Kompilierung einer einzelnen Datei. Auch wenn ich das verwende, funktioniert es nicht in allen Fällen.

Gibt es eine andere Möglichkeit, dass ich dies tun kann oder gibt es ein anderes Plugin/Skript/Software, die mir dabei helfen kann?

Wenn es einige Open-Source-Programme gibt, wäre das sehr hilfreich.

Vielen Dank im Voraus.

7voto

krosenvold Punkte 73093

Zum einen müssen die Klassen kompiliert werden, zum anderen muss die JAVA-VM die Klassen neu laden und verwenden, was als Hot-Swapping bezeichnet wird. Für das bestmögliche Hot-Swapping von Klassen benötigen Sie etwas wie javarebel . Es ermöglicht Ihnen das Hot-Reload einer Menge mehr Arten von Code-Änderungen als die reguläre SUN JVM. Wenn Sie Ihr Deployment im Explosionsmodus ausführen, können Sie jede Codeänderung in etwa einer Sekunde testen. Da wir ziemlich testorientiert arbeiten, verwende ich javarebel nur in dieser kurzen Phase, wenn ich die gesamte Anwendung zusammenstelle, aber es funktioniert wirklich gut.

0 Stimmen

Danke. Ich denke, dass Java Rebel gut zu sein scheint. Ich muss es noch testen. Das einzige, was mir Sorgen macht, ist, dass es keine Freeware/Open Source ist. Kennen Sie etwas anderes, das Freeware/OpenSource ist? Falls Ihre Antwort Nein ist, wie gut ist es, sich Java Rebel zu leisten?

0 Stimmen

Es gibt keine anderen real Alternativen ab dem aktuellen jdk. Javarebel funktioniert gut für mich, aber das ist fast eine separate Frage für sich zu beantworten. Es ist nicht teuer und ja, es ist es wert.

2voto

Scott Stanchfield Punkte 28549

Die Java HotSpot VM tut dies automatisch, aber nicht in allen Fällen...

Erstens müssen Sie eine "Debug"-Sitzung und nicht eine "Run"-Sitzung durchführen.

Bei einigen Änderungen wird ein Neustart erforderlich. Die Grundidee ist, dass die VM den Klasseninhalt nicht inline ersetzen kann, wenn sich die Schnittstelle zur Klasse ändert (die Methodensigs, nicht die eigentliche Java-Schnittstelle).

Sie sollten dafür kein Plugin benötigen, sondern nur eine aktuelle VM.

Dies geschieht unter verschiedenen Umständen wie

  • Methoden hinzufügen
  • Entfernungsmethoden
  • Methodensignaturen ändern
  • Änderung der Klassenhierarchie (Superklassen, implementierte Schnittstellen)

Es kann auch passieren, dass Sie einen Fehler in die Klasse einbringen. (Bei Fehlern wie falsch gesetzten geschweiften Klammern)

Wenn Sie eine Java-Datei speichern, kompiliert Eclipse sie. Wenn dabei ein Fehler auftritt, fügt eclipse eine Ausnahme ein, um anzuzeigen, dass ein ungelöster Kompilierungsfehler vorliegt. (Dies geschieht, damit beim Ausführen nicht nur die letzte erfolgreiche Kompilierung angezeigt wird, wodurch ein Compilerfehler offensichtlich wird)

0 Stimmen

Das hier hat mich gerettet, es scheint zu reichen, um Tomcat im Debug-Modus zu starten. +1

1voto

Sarel Botha Punkte 12053

Ich kenne Eclipse nicht, aber ich verwende Netbeans. Netbeans macht das ziemlich gut. Die neueste Version hat sogar eine Option zum automatischen Neukompilieren, wenn Sie eine Java-Datei speichern.

Ich weiß, dass dies nicht gerade eine Antwort auf Ihre Frage ist. Sie können wahrscheinlich sowohl Netbeans als auch Eclipse verwenden, je nachdem, an welchem Teil des Projekts Sie gerade arbeiten.

EDIT: Mit Tomcat können Sie die Webanwendung neu laden. Das ist aber nur sinnvoll, wenn Tomcat die neue Klasse anschaut. Wenn Ihr Projekt zuerst in ein Build-Verzeichnis kompiliert wird und daraus eine WAR erstellt wird, können Sie in Tomcat die Webanwendung installieren und statt auf eine WAR auf das Build-Verzeichnis verweisen.

In Tomcat müssen Sie möglicherweise eine Site-Config-Datei unter tomcat/conf/Catalina/localhost anlegen. Der Inhalt dieser Datei sieht wie folgt aus:

<?xml version="1.0" encoding="UTF-8"?>
<Context docBase="C:/Projects/MyWebApp/build/web" path="/MyWebApp"/>

Anleitung zum Nachladen hier: http://www.cs.ucl.ac.uk/teaching/java/tomcatfaq.html#changeservlet

Wenn Sie dies ein paar Mal tun, geht Tomcat jedoch der Speicher aus. Das liegt an etwas, das PermGenSpace heißt. Lesen Sie mehr darüber, wenn Sie mehr wissen wollen. Die Lösung besteht darin, den JVM-Speicher und die PermGenSize zu erhöhen (mit -XX:MaxPermSize) und schließlich Tomcat gelegentlich neu zu starten.

EDIT2: Wenn das erneute Laden der Anwendung dazu führt, dass Sie ausgeloggt werden, können Sie den Container leicht dazu bringen, Ihre Sitzungsdaten auf der Festplatte zu serialisieren, indem Sie "implements Serializable" zu einigen Ihrer Klassen hinzufügen. Dann sollten Sie sich nach dem Neuladen der Anwendung nicht mehr anmelden müssen.

0 Stimmen

Ich kann nicht zu Netbeans wechseln. Es wäre toll, wenn dies in Eclipse möglich wäre.

1voto

Ich stimme zu, dass es sehr mühsam ist, bei der Entwicklung immer wieder neu zu verteilen.

Ich würde vorschlagen, dass Sie sich MyEclipse ansehen, das über einen sehr guten Hotdeploy-Mechanismus verfügt, der gut mit Tomcat zusammenarbeitet, und das recht erschwinglich ist und eine 30-tägige Testversion anbietet.

Der standardmäßige Java EE-Mechanismus in Eclipse für die Neuverteilung auf Servern ist bei weitem nicht so schnell.

0voto

Kim Stebel Punkte 41038

Ich glaube, ich weiß nicht so recht, wo das Problem liegt. Hier ist, was ich tue und die Änderungen laden fast sofort. Ich habe ein Ant-Skript, das die .java- und .jsp-Dateien für mich kompiliert, sie in den entsprechenden Verzeichnissen unter webapps ablegt und die Datei web.xml bei Bedarf ändert (oder sie zumindest berührt, um Tomcat über die Änderungen zu informieren). Wenn Sie Hilfe brauchen, wie man das mit Ant macht, helfe ich Ihnen gerne. Übrigens verwende ich keine WAR-Dateien für die Bereitstellung auf meinem Testrechner. Das wäre viel langsamer, denke ich.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X