Mit ‘eclipse’ getaggte Artikel

Bugs vermeiden

Freitag, 13. Juni 2008

Das Code-Review Tool PMD [1] kann als starker Partner an der Seite eines Programmierers eingesetzt werden. Natürlich versucht der Entwickler immer konzentriert alles richtig zu machen und keine Fehler einzubauen – leider gelingt es aber nicht immer, fehlerfreien Code zu schreiben. Hier kommen kleine Helfer wie PMD zum Einsatz, die den Entwickler unterstützen, indem sie nach typischen Fehlermustern suchen.
PMD durchsucht anders als andere Tools den Source-Code (nicht die compilierten Klassen) nach potenziellen Gefahrenquellen. Ein Beispiel ist das Muster des “MissingBreakInSwitch” – Es wird darauf hingewiesen, dass in einem case Zweig einer Switch-Anweisung kein break zu finden ist.
Die Regeln unterstützen neben dem Auffinden von Bugs, auch das Einhalten von OO-Prinzipien. Als Beispiel sei “LooseCoupling” genannt: es wird gefordert, mit Interfaces (wie List) und nicht mit Implementation (wie ArrayList) zu arbeiten.
Ein weiterer Punkt, in dem PMD dem Entwickler unter die Arme greift, ist die Lesbarkeit des Codes:
“ConfusingTernary” – in einem If-Audruck sollte der Testausdruck nicht negiert sein, da dies die Lesbarkeit mindert, wenn noch ein else folgt, z.B.:

if (!list.isEmpty()) {
    this.doSomething();
} else {
    this.doSomethingElse();
}

läßt sich nicht so fließend lesen wie

if (list.isEmpty()) {
    this.doSomethingElse();
} else {
    this.doSomething();
}

PMD kann individuell verschieden genutzt werden – einerseits als Tool, was immer mal wieder während der Implementation ausgeführt wird, andererseits kann es auch fest in einen Buildprozess integriert werden (z.B. Ant, Maven), um Fehlerquellen zu reporten oder sogar um den Build scheitern zu lassen.
Letzteres kann durch das Anpassen der Fehlerpriorität erreicht werden, so dass das Nicht-Einhalten einer Regel quasi zu einem Compilerfehler führt.
Ebenfalls lässt sich PMD in der Auswahl der zu prüfenden Regeln an die eigenen Bedürfnisse anpassen – so ist es z.B. nicht notwendig gegen J2EE Regeln prüfen zu lassen, wenn diese nicht relevant bzw. sogar störend für das aktuelle Projekt sind.

Für eine manuelle Prüfung des Codes bietet sich das Eclipse-Plugin [2] an. Hiermit können selbstgewählte “Pakete” durchsucht werden – ganze Projekte bis hin zu einzelnen Klassen.

Eclipse-Plugin

Nach der Installation des Eclipse-Plugins [2] kann es wie gewohnt über Window ->Preferences -> PMD für den gelegentlichen Einsatz konfiguriert werden.

Wie oben schon erwähnt, lassen sich die anzuwendenden Regeln einzeln auswählen und die Prioritäten auf die verschiedenen Bedürfnisse anpassen.
Sehr hilfreich für eine firmenweite Verteilung ist die Ex- und Import-Funktion. Hierüber können beispielsweise die von PMD bereitgestellten RuleSets geladen und dann als eigener Satz exportiert werden.

Zum Einsatz bringen kann man PMD über das Context-Menü der verschiedenen Resourcen – Projekt, Package, Klasse – durch die Auswahl von PMD -> Check Code With PMD. Eine Auswertung findet dann in einem Extra Tab statt, in dem die gefundenen potentiellen Fehler z.B. nach Priorität und Klasse aufgelistet werden. Zu den Regelverstößen ist auch eine Beschreibung verfügbar, die teilweise Hinweise gibt, wie das “Problem” zu lösen ist.

Weiteres

Für PMD können auch neue Regeln erstellt bzw. die existierenden modifiziert werden – es sei auf [1] verwiesen.
Neben PMD gibt es diverse weitere Code-Review Tools (z.B. FindBugs), die einem die “Käfer” vom Leib halten helfen.

[1] http://pmd.sourceforge.net/
[2] http://pmd.sf.net/eclipse


Andreas Siepert


Maven2 in Eclipse nutzen

Dienstag, 29. April 2008

Viele Projekte verwenden mittlerweile Maven2 für Build, Deployment, usw. Um Maven aus Eclipse heraus relativ komfortabel zu nutzen, sind nicht unbedingt Plugins nötig. Mit wenigen Handgriffen ist das lokale Repository konfiguriert und häufig genutzte Goals eingerichtet.
Plugins bieten zwar Vorteile, z.B. bei der Verwaltung der Dependencies, sind aber leider (noch) an vielen Stellen unflexibel, nicht stabil und umständlich zu benutzen.

Voraussetzung ist eine lauffähige Maven2 Version (Kommandozeile) und im Betriebssystem die Path-Variable MAVEN_HOME, die auf das Maven Installationsverzeichnis verweist (dort wo man Maven entpackt hat).
Die folgenden Schritte wurden mit Eclipse 3.3 durchgeführt.

Lokales Repository zum Buildpath hinzufügen

Damit in Eclipse das Maven Repository gefunden wird, muss die Classpath-Variable M2_REPO angelegt und auf das lokale Repository verlinkt werden.
Das geschieht über das Menü:
Window – Preferences – Java – Build Path – Classpath Variables
Hier mit “New” die Variable M2_REPO anlegen und den Path auf das lokale Maven Repository setzen.
Unter Windows liegt das lokale Repository in der Regel unter:
C:\Dokumente und Einstellungen\<Benutzername>\.m2\repository
Bei Linux unter:
/home/<Benutzername>/.m2/repository

Maven Goals konfigurieren

Hierfür bietet es sich an die “External Tools Launch Configuration” von Eclipse zu nutzen mit der, wie der Name vermuten lässt, externe Programme aufgerufen werden können.

1. Über die Schaltfläche External Tools den Open External Tools Dialog … öffnen.

2. Unter Program eine New launch configuration anlegen.

3. Location: ${env_var:MAVEN_HOME}\bin\mvn.bat
Hiermit wird über die Systemvariable MAVEN_HOME die aktuelle Maven Version aufgerufen.
Z.B. liegt die Maven Installation im Verzeichnis: c:/dev/maven-2.0.7 auf welches die Variable MAVEN_HOME verweist. Eine neuere Maven Version packt man im Verzeichnis c:/dev/maven-2.0.8 aus und stellt nur die MAVEN_HOME Variable entspr. um.

4. Working Directory: ${project_loc}
Nun wollen wir nicht für jedes Projekt eine eigene Launch Configuration anlegen. Das nervt und wird schnell sehr unübersichtlich. Auch hierfür biete Eclipse eine eigene Variable an: ${project_loc} verweist auf das aktuell ausgewählte Projekt.

5. Arguments: install -DcreateChecksum=true
Hier werden Maven die Kommandozeilen-Argumente übergeben. In diesem Fall also ein einfaches install mit Erzeugen der Checksum. Ein weiteres gutes Beispiel ist das eclipse:eclipse Goal. Mit diesen beiden Goals sind schon mal die Grundbedürfnisse erfüllt.

Ausführen eines Maven Goal

Im z.B. Package Explorer ein Maven Projekt auswählen (anklicken), hierdurch wird die Eclipse Variable ${project_loc} gesetzt. Anschließend aus den External Tools das gewünschte Goal auswählen und Maven startet in der Console.
Fertig :-)

Ein typischer Arbeitsschritt wäre z.B.:

  • Anpassungen am pom.xml machen
  • Goal eclipse:eclipse ausführen
  • Refresh des Projekts (F5) -> kann man auch durch die Launch Configuration auto. durchführen lassen
  • Goal install ausführen

BTW: Zusätzlich fügt man diese Launch Configurations noch zu den Favoriten hinzu, dann geht es noch schneller.

Beispiele:
Folgende Goals verwende ich wie oben beschrieben.

  • install -DcreateChecksum=true
  • eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true
  • Da ab maven 2.0.10 beim eclipse Goals auch Projekte referenziert werden, dies aber nicht immer gewünscht ist, kann man dieses Feature abschalten

  • eclipse:eclipse -DdownloadSources=true -DdownloadJavadocs=true -Declipse.useProjectReferences=false

Viel Spaß und Erfolg beim Ausprobieren und Anwenden


Christof Aenderl


Eclipse – Save Actions

Montag, 21. April 2008

In der Entwicklungsumgebung Eclipse gibt es einige Features, die mancher Entwickler zu schätzen weiß, so er sie denn auch entdeckt hat – dazu zählen z.B. die Save Actions, die in diesem Artikel vorgestellt werden.

Save Actions sind, wie es der Name erahnen läßt, Aktionen, die mit dem Speichern einer Java-Datei ausgeführt werden. Zu finden ist die Konfiguration entweder unter dem Menüpunkt Window -> Preferences… -> Java ->Editor -> Save Actions oder im Kontextmenü eines Projektes unter Properties -> Java Editor -> Save Actions. Über den zweiten Weg lassen sich nur die projektbezogenen Einstellungen ändern, nicht die globalen.
Die ersten beiden Punkte Format source code und Organize imports tun genau das, was zu erwarten ist: Den Code entsprechend dem vorgegebenen Code Style Formatter zu formatieren bzw. die Importanweisungen entsprechend dem Code Style zu ordnen. Beide können unter Code Style angepasst werden. Sehr interessant ist der Punkt Additional actions unter dem diverse Regeln zur Code-Änderung selektiert werden können. Hier ein Beispiel:
Wie gerne spart man sich die Klammerung einzeiliger Anweisungen nach einem if-Statement? Durch Aktivierung der entsprechenden Regel wird folgende Änderung im Code durchgeführt:

//vorher
if (condition)
    doSomething();
//nachher
if (condition) {
    doSomething();
}

Zur Warnung sei gesagt, dass es nicht unbedingt sinnvoll ist, alle Regeln zu aktivieren, da sie eventuell zu unerwünschten Änderungen führen können – ein Beispiel sind die Regeln unter Unnecessary Code: Sind diese Regeln aktiviert, könnte folgendes passieren: Wird zum Testen eine Code-Passage auskommentiert, so werden nur dort benutzte Variablen und Importe ungewollterweise entfernt – meist ist dies aber erst festzustellen, wenn nach dem Reaktivieren der Codepassage der Compiler Fehler meldet. Desweiteren sollten die Save-Actions natürlich mit dem Code Style des Projektes harmonieren.

Ein weiterer Aspekt, der bei der Einführung von Save Actions bedacht werden sollte: Wird das nützliche Tool erst später in einem Projekt aktiviert, so wird es sehr wahrscheinlich zu Problemen beim Nachvollziehen von “echten” Code-Änderungen zwischen zwei Versionsständen geben.

Save Actions gibt es seit der Eclipse Version 3.3 (Europa)


Andreas Siepert


Sonderzeichen in Resource Bundles

Mittwoch, 09. April 2008

Die Werte aus den properties-Dateien werden mit einer MessageFormat Instanz mit möglichen Argumenten befüllt. Die Position, die Selection des Argumentes und zusätzliche Formatierungen müssen in den Text integriert werden.

Die einfachste Angabe ist {0} für das erste mitgegebene Argument.

Deshalb werden die Zeichen ‘ (quote), \ (backslash), { (open brace) und } (close brace) als Sonderzeichen behandelt und müssen für die normale Verwendung folgendermaßen verschlüsselt werden, um sie vor dem Parser zu schützen:

  • ein ‘ wird mit einem weiteren ‘ versehen, so dass ein ” (double-single quote) entsteht
  • ein \ wird mit einem weiteren \ versehen, so dass ein \ \ (double backslash) entsteht
  • ein } wird mit ‘ umfasst, so dass die Zeichenkette ‘}’ entsteht
  • ein { wird mit ‘ umfasst, so dass die Zeichenkette ‘{‘ entsteht

Referenz: Java-API, siehe MessageFormat

Hinweis: Am besten einen Resource Bundle Editor verwenden z.B. für eclipse: Resource Bundle Editor
Dann werden auch Umlaute und Sonderzeichen in Unicode gewandelt.


Hendrik Lange