1. 概要

簡単に言うと、 PMD は、未使用の変数、空のキャッチブロック、不要なオブジェクトの作成など、一般的なプログラミングの欠陥を見つけるためのソースコードアナライザーです。

Java、JavaScript、Salesforce.com Apex、PLSQL、Apache Velocity、XML、XSLをサポートしています。

この記事では、PMDを使用してJavaプロジェクトで静的分析を実行する方法に焦点を当てます。

2. 前提条件

PMDをMavenプロジェクトにセットアップすることから始めましょう– maven-pmd-pluginを使用して構成します。

<project>
    ...
    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.7</version>
                <configuration>
                    <rulesets>
                        <ruleset>/rulesets/java/braces.xml</ruleset>
                        <ruleset>/rulesets/java/naming.xml</ruleset>
                    </rulesets>
                </configuration>
            </plugin>
        </plugins>
    </reporting>
</project>

maven-pmd-pluginの最新バージョンはここにあります。

ここで構成にルールセットを追加していることに注意してください。これらは、PMDコアライブラリからすでにルールを定義するための相対パスです。

最後に、すべてを実行する前に、いくつかの明白な問題を含む単純なJavaクラスを作成しましょう。これは、PMDが問題の報告を開始できるものです。

public class Ct {

    public int d(int a, int b) {
        if (b == 0)
            return Integer.MAX_VALUE;
        else
            return a / b;
    }
}

3. PMDを実行する

単純なPMD構成とサンプルコードを使用して、ビルドターゲットフォルダーにレポートを生成しましょう。

mvn site

生成されたレポートはpmd.htmlと呼ばれ、 target /siteフォルダーにあります。

Files

com/baeldung/pmd/Cnt.java

Violation                                                                             Line

Avoid short class names like Cnt                                   1–10 
Avoid using short method names                                  3 
Avoid variables with short names like b                        3 
Avoid variables with short names like a                        3 
Avoid using if...else statements without curly braces 5 
Avoid using if...else statements without curly braces 7 

ご覧のとおり、結果は得られていません。 PMDによると、レポートにはJavaコードの違反と行番号が表示されます。

4. ルールセット

PMDプラグインは、5つのデフォルトのルールセットを使用します。

  • basic.xml
  • empty.xml
  • imports.xml
  • required.xml
  • usedcode.xml

他のルールセットを使用するか、独自のルールセットを作成して、プラグインでこれらを構成することができます。

<project>
    ...
    <reporting>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.7</version>
                <configuration>
                    <rulesets>
                        <ruleset>/rulesets/java/braces.xml</ruleset>
                        <ruleset>/rulesets/java/naming.xml</ruleset>
                        <ruleset>/usr/pmd/rulesets/strings.xml</ruleset>
                        <ruleset>http://localhost/design.xml</ruleset>
                    </rulesets>
                </configuration>
            </plugin>
        </plugins>
    </reporting>
</project>

構成の「ルールセット」値の値として、相対アドレス、絶対アドレス、またはURLのいずれかを使用していることに注意してください。

プロジェクトに使用するルールをカスタマイズするためのクリーンな戦略は、カスタムルールセットファイルを作成することです。 このファイルでは、使用するルールを定義し、カスタムルールを追加し、公式ルールセットに含める/除外するルールをカスタマイズできます。

5. カスタムルールセット

次に、PMDの既存のルールセットから使用する特定のルールを選択し、それらをカスタマイズしてみましょう。

まず、新しいruleset.xmlファイルを作成します。 もちろん、既存のルールセットファイルの1つを例として使用し、それをコピーして新しいファイルに貼り付け、古いルールをすべて削除して、名前と説明を変更することもできます。

<?xml version="1.0"?>
<ruleset name="Custom ruleset"
  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">
    <description>
        This ruleset checks my code for bad stuff
    </description>
</ruleset>

次に、いくつかのルール参照を追加しましょう。

<!-- We'll use the entire 'strings' ruleset -->
<rule ref="rulesets/java/strings.xml"/>

または、いくつかの特定のルールを追加します。

<rule ref="rulesets/java/unusedcode.xml/UnusedLocalVariable"/>
<rule ref="rulesets/java/unusedcode.xml/UnusedPrivateField"/>
<rule ref="rulesets/java/imports.xml/DuplicateImports"/>
<rule ref="rulesets/java/basic.xml/UnnecessaryConversionTemporary"/>

ルールのメッセージと優先度をカスタマイズできます。

<rule ref="rulesets/java/basic.xml/EmptyCatchBlock"
  message="Must handle exceptions">
    <priority>2</priority>
</rule>

また、次のようにルールのプロパティ値をカスタマイズすることもできます。

<rule ref="rulesets/java/codesize.xml/CyclomaticComplexity">
    <properties>
        <property name="reportLevel" value="5"/>
    </properties>
</rule>

個々の参照ルールをカスタマイズできることに注意してください。 ルールのクラス以外はすべて、カスタムルールセットでオーバーライドできます。

次へ–ルールセットからルールを除外することもできます。

<rule ref="rulesets/java/braces.xml">
    <exclude name="WhileLoopsMustUseBraces"/>
    <exclude name="IfElseStmtsMustUseBraces"/>
</rule>

次へ–オプションのオーバーライドインクルードパターンを使用して、除外パターンを使用してルールセットからファイルを除外することもできます。

一致する除外パターンはあるが、一致する包含パターンがない場合、ファイルは処理から除外されます。

ソースファイルパスのパス区切り文字は「/」文字に正規化されるため、同じルールセットを複数のプラットフォームで透過的に使用できます。

さらに、この除外/包含手法は、PMDの使用方法に関係なく機能します(例: コマンドライン、IDE、Ant)により、PMDルールの適用を環境全体で一貫性のある状態に保つことが容易になります。

簡単な例を次に示します。

<?xml version="1.0"?>
<ruleset ...>
    <description>My ruleset</description>
    <exclude-pattern>.*/some/package/.*</exclude-pattern>
    <exclude-pattern>
       .*/some/other/package/FunkyClassNamePrefix.*
    </exclude-pattern>
    <include-pattern>.*/some/package/ButNotThisClass.*</include-pattern>
    <rule>...
</ruleset>

6. 結論

このクイック記事では、Javaコードの静的分析に焦点を当てた柔軟で高度に構成可能なツールであるPMDを紹介しました。

いつものように、このチュートリアルで提示される完全なコードは、Githubから入手できます。