Erhöhen der Softwarequalität mit Apache ANT und einem Builder für Eclipse
Samstag 19. Januar 2008 von aha
Der folgende Beitrag beschäftigt sich mit dem Problem des “Logging” in Java-Programmen und wie dieses elegant mit Apache ANT (http://ant.apache.org) und Eclipse (http://www.eclipse.org) gelöst werden kann.
Gerade im JEE-Umfeld möchte man vorallem während der Entwicklungs- und Test-Phase viele Programmausgaben um Fehler schneller finden zu können. Da diese Ausgaben auch beim Fehlersuchen in Produktiv-Systemen nützlich sind, lässt man diesen Code gerne in der ausgelieferten Version und bemüht sogn. Logging-Bibliotheken (z.B. http://logging.apache.org/log4j) welche die Ausgaben genau steuern. Trotzdem ist der Produktiv-Code vermischt mit Statements der Art:
if (logger.isDebug()) {
logger.debug(i + “ Requests processed“);
}
Da dies den eigentlichen Code unleserlich macht, verwenden viele Unternehmen AspectJ (http://www.eclipse.org/aspectj) welches den Code beim Kompilieren oder Programmstart modifiziert und solche Debug-Ausgaben “hineinwebt”. Leider muss man hierfür eine teils komplexe Sprache lernen um die Stellen (Pointcuts) zu beschreiben und man verliert die Lokalität (den Code den man im Editor sieht ist nicht der Code der ausgeführt wird). Oft ist es aber so, dass man zum einen einen Kommentar schreibt, warum was passiert und gleichzeitig eine Log-Ausgabe, damit man die Ausführung verfolgen kann:
if ((doSomething() && isUserAuthorized()) || specialCondition()) {
//This code is executed because of ….
if (logger.isDebug()) {
logger.debug(“Comment…“
+“(User was authorized: ”
+isUserAuthrized()
+”, SpeicalCondition: ”
+specialCondition()
+”)”
);
}
}
Die Idee ist nun, spezielle Kommentare einzuführen, die vor dem eigentlichen Kompilieren in Log-Statements umgewandelt werden:
if ((doSomething() && isUserAuthorized()) || specialCondition()) {
///Comment….
///user was authorized: {isUserAuthorized()}
///special condition: {specialCondition()}
}
Diese Kommentare beginnen mit /// und alles was zwischen { und } steht, wird als Java-Code interpretiert. Vor dem Kompilieren kann dieses Statement dann zu if (logger.isDebug()) { logger.debug(”…“); } umgebaut werden. Nun wird der Code zwar immernoch “heimlich” verändert, aber man sieht die exakte Stelle und selbst die Zeilenangaben des Debuggers sind korrekt, man kann also auch den erzeugten Kommentar “debuggen”.
Mit Hilfe von ANT ist dies sehr einfach zu realisieren indem man einen eigenen Task definiert (s. Beispielquelltext) der die Umwandlung durchführt. Die angehängte build.xml definiert einen eigenen Builder für Eclipse-Projekte, der alle Dateien im Unterverzeichnis “src” umwandelt und nach “bin” kompiliert.
Die Umwandlung wird mit dem “commentlog”-Task durchgeführt wobei “toDir” das Zielverzeichnis angibt und “loggerMethod” beschreibt, wie die Ausgabe stattfinden soll. Der $ wird später durch den erzeugten String asugegeben. In dem Beispiel wird immer alles nach System.err geschrieben:
<commentlog toDir=”${PROJECT}\bin\tmp” loggerMethod=”System.err.println($);“>
<fileset dir=”src” includes=”${FILES_CLEANED}” />
</commentlog>
Um den Builder für ein Eclipse-Projekt zu aktivieren, muss man das angehängte build.xml und commentslog.jar in das Projekt kopieren. Danach öffnet man den Eigenschaften-Dialog für das Projekt (Alt+Enter), Wählt “New” und dann “Ant-Builder” aus. In dem Kartenreiter “Main” muss man nun das Buildscript und das Basisverzeichnis auswählen. Als Buildscript die angehängt build.xml auswählen und als Basisverzeichnis das Projekt selbst auswählen:

Dann im Kartenreiter “Targets” die Build-Targets auswählen. Für “After a Clean”: rebuild, für “Manual-” und “Auto Build”: build und für “During a Clean”: clean.
Im Kartenreiter Properties sollte man noch die folgenden Werte hinzufügen:
build.compiler=org.eclipse.jdt.core.JDTCompilerAdapter
FILES=$build_files:a,c,f}
PROJECT=${build_project}
Abschließend sollte man bei “Build Options” noch die “Relevanten Dateien” auswählen, da der Builder sonst immer zweimal angestoßen wird (einmal bei der Änderung und einmal für die in bin/tmp generierte Datei). Man muss also “Specify working set of relevant resources aus” und selektiert dann nur das “src”-Verzeichnis.
Nun kann man beliebigen Java-Code mit “///” Komentaren versehen die zu Log-Statements umgebaut werden. Der Code sollte jedoch innerhalb einer Methode sein, sonst wird unkompilierbarer Code erzeugt. Außerdem werden nur Zeilen-Kommentare umgesetzt, d.h. vor /// darf nichts stehen. Die beiden Angehängten Java-Dateien welche die ANT-Tasks implementieren, verwenden solche Kommentare zur Demonstration:
Alle Quellen und eine vorkompilierte jar finden Sie hier: Beispielquelltext
Kategorie: Java EE | Keine Kommentare »




