Artikel

 
April 2009 | Artikel

JavaRebel: Ein rebellisches Aha-Erlebnis

(Link zum Artikel: http://www.it-republik.de/jaxenter/artikel/2268)

Der Tool-Radar

Text: Marc Teufel
Wann hatten Sie Ihr letztes Aha-Erlebnis? Wann haben Sie zuletzt ein Tool evaluiert, das von Anfang an überzeugen konnte, dass genau dieses Werkzeug Ihre tägliche Arbeit erleichtern wird? Ein solches Tool möchten wir Ihnen heute vorstellen: JavaRebel.

Dabei handelt es sich um ein Werkzeug aus dem Hause ZeroTurnaround, das Änderungen an Java-Klassen im laufenden Betrieb überwacht und erkennt, die geänderte Klasse automatisch nachlädt und der laufenden Anwendung sofort zur Verfügung stellt. Der Clou dabei liegt auf der Hand: Änderungen am Quellcode werden so in der laufenden Anwendung sofort und ohne Neustart aktiv. Das spart Zeit und Geld im Entwicklungsprozess, denn die mitunter zeitaufwändigen Wartepausen, die beispielsweise beim wiederholten Redeployment einer Webanwendung entstehen, nur um vorher durchgeführte Codeänderungen zu überprüfen, können enorm sein. Mit JavaRebel können diese Zwangspausen auf ein erträgliches Level abgesenkt werden. Dabei kann JavaRebel nahezu überall eingesetzt werden: tn Java-EE-Projekten, Webanwendungen, Spring bis hin zur Eclipse RCP – der Rebell ist mit wenigen Handgriffen einsatzbereit.

Unter der Haube

Neben so populären neuen Features wie Annotations oder Generics wurde mit Java 5 auch das so genannte Instrumentation API (java.lang.instrument) eingeführt. Mit diesem neuen API ist es möglich, Konstrukte zu programmieren, die sich über den JVM-Parameter –javaagent in eine laufende VM einklinken lassen. Einmal eingeklinkt, lassen sich dann mithilfe der neuen API Veränderungen an allen in der VM befindlichen Klassen vornehmen, bevor sie ausgeführt werden. JavaRebel nutzt diese Technik, um entsprechende Klassen nach Veränderungen einfach neu zu laden. Ein weiteres, sehr prominentes Produkt, das die Instrumentation API ebenso einsetzt, ist AspectJ. Konkret kommt hier beim Einweben von Aspekten auf Bytecodeebene (Load Time Weaving) ein von AspectJ bereitgestellter Agent zum Einsatz. Wer jetzt mehr über das Instrumentation API erfahren möchte, dem sei dieser und dieser Link zur Lektüre empfohlen.

Konfigurationsbeispiele

Stellen Sie sich vor, Sie entwickeln eine auf JSF oder Spring MVC basierende Webanwendung. Dabei benutzen Sie einen durch Ant oder Maven gestützten Build-Prozess in Verbindung mit Tomcat. JavaRebel binden Sie in diesem Szenario an den Tomcat-Server. Hierzu ist in der Konfigurationsdatei catalina.bat der Tomcat-Installation lediglich folgende Zeile hinzuzufügen:

  1. set JAVA_OPTS=-noverify -javaagent:C:\javarebel-1.2.2\javarebel.jar %JAVA_OPTS%

Das Flag –noverify, laut Dokumentation dringend erforderlich, schaltet die so genannte Bytecode Verification in der JVM ab. Einige weitere Konfigurationsbeispiele (z.B. für JBoss, GlassFish, Jetty) finden sich ebenso in der Dokumentation. Zur weiteren, verfeinerten Konfiguration von JavaRebel stehen darüber hinaus noch zusätzliche Parameter zur Verfügung, mit denen man beispielsweise die Überwachung der Java-Klassen auf bestimmte Verzeichnisse oder Packages beschränken kann (Tabelle 1). Besonders interessant ist JavaRebel auch in der Welt der RCP- oder Plug-in-Entwicklung mit Eclipse. Hier binden Sie JavaRebel schlicht in der entsprechenden Run Configuration (Reiter Arguments, Eingabefeld VM arguments) wie folgt ein:

  1. -noverify -javaagent:C:\javarebel-1.2.2\javarebel.jar -Xmx512m -XX:MaxPermSize=128m
Fazit

JavaRebel ist ein sinnvolles Werkzeug, das die Entwicklungszeit von Java-Anwendungen beschleunigen kann, weil es die Möglichkeit bietet, Java-Klassen zu überwachen und zur Laufzeit auszutauschen. Somit kann das wiederholte Neustarten oder Redeployment der entwickelten Java-Anwendung auf ein erträgliches Maß gesenkt werden. Möglich wird dies durch das mit Java 5 eingeführte Instrumentation API. JavaRebel ist ein kommerzielles Produkt, dessen Konzept und Praxistauglichkeit zu überzeugen wissen. Geben Sie dem Werkzeug einen Testlauf und genießen Sie Ihr nächstes Aha-Erlebnis.

Parameter Beschreibung
-Drebel.dirs Angabe von Verzeichnissen, in denen JavaRebel die .class-Files auf Änderungen überwachen soll; Angaben getrennt durch Strichpunkt
-Drebel.packages Bei Verwendung dieses Parameters wird JavaRebel nur die Klassen überwachen, die zu den angegebenen Packages gehören; Angaben getrennt durch Strichpunkt

Tabelle 1: Kleine Auswahl von Parametern mit denen JavaRebel konfiguriert werden kann

Marc Teufel arbeitet als Softwareentwickler bei der hama GmbH & Co und ist dort für die Entwicklung großer Java-Anwendungen im Logistikzentrum zuständig. Er ist Autor zahlreicher Fachartikel zu Java und .NET, hat zwei Bücher zu Apache Axis publiziert und spricht regelmäßig auf Fachkonferenzen. Unter www.teufel.net ist er im Web zu erreichen.
  1. JavaRebel-Webseite
  2. How To, -javaagent
  3. Instrumentation – Modify Applications with Java 5 Class File Transformations
  4. Bytecode Verification

andere Artikel dieser Serie


Anzeige

Kommentare

Gravatar RPR 27.04.2009
um 20:14 Uhr
Vor ein paar Jahren musste ich mal an einem J2EE-Projekt arbeiten, bei dem man für ein Redeployment nach jedem Fix / Feature 15 - 20 Minuten brauchte. Ergebnis: Die Entwickler ließen 90 % Ihrer Zeit beim Zusehen der Entstehung von jars, wars, ears, JBoss-Restarts, DB-Inits, ... Wahnsinn.
Mein Fazit von damals: Nutze keine Technologie, die dich nur behindert. Somit brauche ich auch heute kein JavaRebel auch wenn es sich echt gut anhört!
#zitieren
Gravatar Dimitri Alexeev 27.04.2009
um 22:56 Uhr
Wie wäre es denn endlich mal damit aufzuhören, nach jeder Buchstabe im Quelltext der "Entstehung von jars" zuzusehen?! Die Software-Enwickler von heute ähneln sich immer mehr den Affen an Schreibmaschinen, die früher oder später Shakespeare Texte generieren. Hot-Deployment vorausgesetzt. #zitieren

Anzeige

zurück zum Seitenanfang