PMD

Name

PMD

Homepage

http://www.pmd.sourceforge.net

Lizenz

BSD-Lizenz

Untersuchte Version

5.0.0

Letzter Untersuchungszeitpunkt

05.07.2012

Kurzbeschreibung

PMD analysiert Javasourcecode u.a. auf folgende Gesichtspunkte:

  • Mögliche Bug-Quellen wie z.B. leere try-catch-finally-Statements
  • Unbenutzter Code
  • Unnötige if/for-Statements
  • Duplizierter Code
  • Fazit

    PMD bietet eine Vielzahl an Möglichkeiten. Anfänger können innerhalb von wenigen Minuten das Plugin für die gewünschte IDE installieren
    und sofort ihren Java-Code nach möglichen Fehlerquellen analysieren lassen. Fortgeschrittene können die Überprüfung über die Windows-Konsole oder Linux-Shell
    laufen lassen. Auch eigene Code-Rules lassen sich erstellen. Dafür kann man entweder Javas-Code oder XML(XPath) nutzen.

    Einsatzgebiete

    Analyse der Einhaltung von Coding-Guidelines

    Einsatzumgebungen

    PMD lässt sich leicht in fast jede bekannte IDE als Plugin integrieren (JDeveloper, Eclipse, JEdit, JBuilder, BlueJ,...)
    Auch die Anwendung als Kommandozeilen-Werkzeug ist möglich.

    Installation

    Die Installation gestaltet sich einfach und benutzerfreundlich. PMD lässt sich hier herunterladen.
    Man bekommt einen Zip-Ordner, der entpackt werden muss. Nun kann man von der Kommandozeile aus PMD nutzen.
    Auch das installieren als Plugin ist möglich (Hier erklärt für Eclipse).Man fügt "http://pmd.sourceforge.net/eclipse" als Quelle unter Help->Install New Software hinzu.
    Sobald das PMD-Plugin installiert ist, kann es im Drop-Down-Menü benutzt werden.
    Anfänger können somit leicht ihren Code auf Fehler überprüfen, indem sie auf Check Code with PMD drücken. Fortgeschrittene Benutzer können mit dem Rule Designer eigene Code-Rules erstellen.
    pmdinstall

    Dokumentation

    Die offiziellen Dokumentationen zu den einzelnen Komponenten von PMD sind sehr kurz gehalten, dafür mit sehr vielen Beispielen versehen, sodass sich erfahrene Programmierer ggf. alle nötigen Funktionen selbst herleiten können.

    Wartung der Projektseite

    Die Projektseite wird unregelmäßig aktualisiert. Das letzte Update gab es zum 01.05.2012 auf Version 5.0.0. Die Entwickler geben außerdem bereits Aussicht auf eine neue Version auf einer Snapshot-Seite.

    Nutzergruppen und Support

    Die Entwickler weisen auf ihr Forum hin, an das man sich bei Fragen wenden solle.

    Einführendes Beispiel

    Anwendung über Kommandozeile
    Die allgemeine Syntax ist: ":/>pmd [filename|jar or zip file containing source code|directory] [report format] [ruleset file]"
    Beispiel:
    Wichtig ist, dass man sich im Verzeichnis \pmd-5.0.0\pmd\bin befindet oder dieses Verzeichnis in seine Pfad-Variable des Betrikebssystems einbindet.
    Dadruch lässt sich folgender Befehl ausführen:
    C:\tmp\pmd-5.0.0\pmd\bin>pmd c:\data\pmd\pmd\test-data\Unused1.java xml rulesets/java/unusedcode.xml

    Es wird das Ruleset Unusedcode zur Überprüfung auf unbenutzten Code auf die Quellcodedatei Unused1.java angewendet

    Eingabe Unused1.java:
    
    public class Unused1 {	
    
    	public static void main(String[] args) {
    		
    		String fr;
    		int zahl1=2;
    		int zahl2=3;
    		
    		System.out.println(zahl1+zahl2);
    
    	}
    }
    
    
    Ausgabe:
    <?xml version="1.0"?><pmd>
    <file name="c:\data\pmd\pmd\test-data\Unused1.java">
    <violation line="5" rule="UnusedLocalVariable">
    Avoid unused local variables such as 'fr'
    </violation>
    </file></pmd>


    Violation line gibt an, in welcher Zeile der Fehler gefunden wurde. Danach wird eine Erklärung dazu ausgegeben. Um ein anderes Ruleset auf die Quellcodedatei anzuwenden, ersetzt man rulesets/java/unusedcode.xml durch die gewünschte XML-Datei.

    Anwendung als Eclipse-Plugin
    Folgender Beispieljavacode zum Aufbauen einer Datenbankverbindung ist gegeben:
    
    public class BasicJDBC {
    
    	public static void main(String[] args) throws IOException {
    
    		Statement stmt = null;
    		ResultSet rs = null;
    		java.sql.ResultSetMetaData md;
    		java.sql.Connection con = null;
    		String login;
    		String pw;
    		String statement;
    		Integer s = 0;
    
    		String url;
    
    		InputStreamReader isr = new InputStreamReader(System.in);
    		BufferedReader br = new BufferedReader(isr);
    		String db = "jdbc:oracle:thin:@";
    
    		try {
    
    			Class.forName("oracle.jdbc.OracleDriver");
    			System.out.println("Treiber eingebunden!");
    
    		} catch (Exception x) {
    			System.out.println(x.getMessage() + "|CAUSE: " + x.getCause() + "|"
    					+ "| Fehler beim Laden vom ODBC-Treiber!");
    		}
    
    		System.out.println("Oracle-Datenbank-URL: ");
    		url = br.readLine();
    		System.out.println("Login: ");
    		login = br.readLine();
    		System.out.println("Password: ");
    		pw = br.readLine();
    
    		try {
    
    			con = DriverManager.getConnection(db + url, login, pw);
    			con.setAutoCommit(false);
    			System.out.println("Verbindung hergestellt!");
    
    		} catch (Exception e) {
    
    			System.out.println(e.getMessage() + "|CAUSE: " + e.getCause() + "|"
    					+ "|Verbindung NICHT hergestellt!");
    
    			System.err.println("Fehler beim Verbindungsaufbau");
    
    		}
    	}
    }
    

    Sobald man im Drop-Down-Menü die PMD-Violations aktiviert hat, werden am linken Rand die Warnungen angezeigt. Mit Clear PMD Violations werden die Benachrichtigungen wieder deaktiviert.
    pmdinstall2 pmdwarning

    Erstellen von Rulesets
    Rules lassen sich unter Window->Configurations->PMD->Rules Configuration erstellen.
    rules

    Dort ist es auch möglich andere Rules zu ändern, indem man sie auswählt und dann Edit Rule oder Remove Rule selektiert. Mit Klick auf Add Rule lassen sich neue Regeln hinzufügen.
    addrules

    Für die eigentliche Definition einer Regel wird XPath verwendet. Beispiel für eine Rule in Xpath:
    <?xml version="1.0"?> <ruleset name="My custom rules" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 http://pmd.sourceforge.net/ruleset_2_0_0.xsd" xsi:noNamespaceSchemaLocation="http://pmd.sourceforge.net/ruleset_2_0_0.xsd"> <rule name="WhileLoopsMustUseBracesRule" message="Avoid using 'while' statements without curly braces" class="WhileLoopsMustUseBracesRule"> <description> Avoid using 'while' statements without using curly braces </description> <priority>3</priority> <example> <![CDATA[ public void doSomething() { while (true) x++; } ]]> </example> </rule> </ruleset>
    In diesem Beispiel wird eine Regel erstellt die eine Warnung ausgeben soll wenn eine While-Schleife ohne geschweifte Klammern genutzt wird. Folgende Elemente und Parameter sind dabei wichtig:

  • name: Name der Regel
  • message: Text für die Warnung
  • class: Klasse in der die Regel definiert wurde
  • description: Genauere Beschreibung der Regel
  • example: Ein kurzes Beispiel in CDATA-Tags


  • Nachdem die Regel erstellt wurde, kann sie unter Rules Configuration eingesehen und bearbeitet werden. Auch ist es möglich, mit Hilfe des mitgelieferten Rule Designer eine Regel zu erstellen.
    Dieser generiert automatisch aus Javacode einen AST(Abstract Syntax Tree) was das Erstellen von Regeln erleichtert.

    Literatur

    PMDApplied

    Zurück zur Werkzeugübersicht
    Zurück zur CSI-Hauptseite