かんがるーさんの日記

最近自分が興味をもったものを調べた時の手順等を書いています。今は Spring Boot をいじっています。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その56 )( PMD を 5.8.1 → 6.4.0 へバージョンアップする2 )

概要

記事一覧はこちらです。

Spring Boot + npm + Geb で入力フォームを作ってテストする ( その55 )( PMD を 5.8.1 → 6.4.0 へバージョンアップする ) の続きです。

  • 今回の手順で確認できるのは以下の内容です。
    • PMD を 5.8.1 → 6.4.0 へバージョンアップします。前回からの続きです。

参照したサイト・書籍

目次

  1. category/java/documentation.xml
    1. Field comments are required
    2. Document empty method body
    3. Comment is too large: Line too long
    4. Enum comments are required
  2. category/java/errorprone.xml
    1. Found '...'-anomaly for variable '...' (lines ...).
    2. Found non-transient, non-static member. Please mark as transient or provide accessors.
    3. Avoid using Literals in Conditional Statements
    4. Class cannot be instantiated and does not provide any static methods or fields
  3. category/java/multithreading.xml
  4. category/java/performance.xml
    1. StringBuffer (or StringBuilder).append is called consecutively without reusing the target variable.
    2. Avoid using redundant field initializer for '...'
  5. category/java/security.xml
  6. config/pmd/pmd-project-rulesets.xml はこうなりました

手順

category/java/documentation.xml

設定を追加して build タスクを実行すると 112 PMD rule violations were found. と出力されました。メッセージは以下の4種類でした。

  • Field comments are required
  • Document empty method body
  • Comment is too large: Line too long
  • Enum comments are required

Field comments are required

CommentRequired のルール違反のメッセージです。前は <property name="fieldCommentRequirement" value="Ignored"/> と設定していたので、今回も同じ設定を入れます。

Document empty method body

UncommentedEmptyMethodBody のルール違反のメッセージです。前も exclude していたので、今回も exclude します。

Comment is too large: Line too long

CommentSize のルール違反のメッセージです。

このルールでは1行の最大文字数が 80 文字に設定されていますが IntelliJ IDEA では1行の最大文字数は default では 120 なので、<property name="maxLineLength" value="120"/> を入れて IntelliJ IDEA と同じ文字数になるようにします。

Enum comments are required

これも CommentRequired のルール違反のメッセージです。前は <property name="enumCommentRequirement" value="Ignored"/> と設定していたので、今回も同じ設定を入れます。

以上で category/java/documentation.xml は以下のような定義になりました。

    <rule ref="category/java/documentation.xml">
        <!-- CommentRequired はここでは exclude し、下で別途定義する -->
        <exclude name="CommentRequired"/>
        <exclude name="UncommentedEmptyMethodBody"/>
        <!-- CommentSize はここでは exclude し、下で別途定義する -->
        <exclude name="CommentSize"/>
    </rule>
    <rule ref="category/java/documentation.xml/CommentRequired">
        <properties>
            <property name="fieldCommentRequirement" value="Ignored"/>
            <property name="enumCommentRequirement" value="Ignored"/>
        </properties>
    </rule>
    <rule ref="category/java/documentation.xml/CommentSize">
        <properties>
            <property name="maxLineLength" value="120"/>
        </properties>
    </rule>

category/java/errorprone.xml

設定を追加して build タスクを実行すると 30 PMD rule violations were found. と出力されました。メッセージは以下の4種類でした。

  • Found '...'-anomaly for variable '...' (lines ...).
  • Found non-transient, non-static member. Please mark as transient or provide accessors.
  • Avoid using Literals in Conditional Statements
  • Class cannot be instantiated and does not provide any static methods or fields

Found '...'-anomaly for variable '...' (lines ...).

DataflowAnomalyAnalysis のルール違反のメッセージです。

メッセージが出た箇所を見ると lambda 式の引数で出ているようで、対応のしようがないので exclude します。lambda 式でルール違反のメッセージが出るようでは、このルールは使えないのでは?

Found non-transient, non-static member. Please mark as transient or provide accessors.

BeanMembersShouldSerialize のルール違反のメッセージです。

メッセージが出た箇所を見ると DI 用のフィールド変数でした。対応のしようがないので exclude します。

Avoid using Literals in Conditional Statements

AvoidLiteralsInIfCondition のルール違反のメッセージです。

条件式で定数を直接記述していると出るメッセージでした。定数文字列を定義してそれを使用するようソースを修正します。

Class cannot be instantiated and does not provide any static methods or fields

MissingStaticMethodInNonInstantiatableClass のルール違反のメッセージです。

リンク先の説明を読みましたが、今は必要そうに思えなかったので exclude することにします。

以上で category/java/errorprone.xml は以下のような定義になりました。

    <rule ref="category/java/errorprone.xml">
        <exclude name="DataflowAnomalyAnalysis"/>
        <exclude name="BeanMembersShouldSerialize"/>
        <exclude name="MissingStaticMethodInNonInstantiatableClass"/>
    </rule>

category/java/multithreading.xml

設定を追加して build タスクを実行しても PMD のルール違反は出ませんでした。

category/java/performance.xml

設定を追加して build タスクを実行すると 11 PMD rule violations were found. と出力されました。メッセージは以下の2種類でした。

  • StringBuffer (or StringBuilder).append is called consecutively without reusing the target variable.
  • Avoid using redundant field initializer for '...'

StringBuffer (or StringBuilder).append is called consecutively without reusing the target variable.

ConsecutiveAppendsShouldReuse のルール違反のメッセージです。

指摘された箇所を

        sb.append("ControllerName = ");
        sb.append(loggingGamenName);
        sb.append(", ");

以下のように修正します。

        sb.append("ControllerName = ")
                .append(loggingGamenName)
                .append(", ");

Avoid using redundant field initializer for '...'

RedundantFieldInitializer のルール違反のメッセージです。

リンク先を読むとフィールド変数をデフォルト値と同じ値で変数を初期化しているとメッセージが表示されるルールでした。確かにメッセージが出ている箇所を確認したところ boolean 型のフィールド変数を false で初期化していました。

メッセージが出ているフィールド変数に false をセットしている処理を削除することにします。

category/java/security.xml

設定を追加して build タスクを実行しても PMD のルール違反は出ませんでした。

config/pmd/pmd-project-rulesets.xml はこうなりました

最終版の config/pmd/pmd-project-rulesets.xml を記載しておきます。最初はバージョンアップ後に大量にメッセージが出力されたので移行は大変かと思いましたが、Rule が8種類のCategory に分類されたことと、独自 Rulesets の書き方さえ分かれば大したことはありませんでした。

<?xml version="1.0" encoding="UTF-8"?>
<ruleset name="mybraces"
         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>project rulesets</description>

    <!--
        rulesets の種類・説明は 以下の URL 参照
        https://github.com/pmd/pmd/tree/master/pmd-java/src/main/resources/category/java
        https://github.com/pmd/pmd/tree/master/pmd-java/src/main/resources/rulesets/java
        https://pmd.github.io/pmd-6.4.0/pmd_rules_java.html
        ※"pmd-6.4.0" の部分は適用しているバージョンに変更すること。
    -->
    <rule ref="category/java/bestpractices.xml"/>
    <rule ref="category/java/codestyle.xml">
        <exclude name="VariableNamingConventions"/>
        <exclude name="MethodArgumentCouldBeFinal"/>
        <exclude name="LongVariable"/>
        <exclude name="LocalVariableCouldBeFinal"/>
        <exclude name="AtLeastOneConstructor"/>
        <exclude name="ShortVariable"/>
        <exclude name="UnnecessaryAnnotationValueElement"/>
        <exclude name="ClassNamingConventions"/>
        <exclude name="DefaultPackage"/>
        <exclude name="CommentDefaultAccessModifier"/>
        <exclude name="OnlyOneReturn"/>
    </rule>
    <rule ref="category/java/design.xml">
        <exclude name="LoosePackageCoupling"/>
        <exclude name="UseUtilityClass"/>
        <exclude name="NcssCount"/>
        <exclude name="LawOfDemeter"/>
        <exclude name="DataClass"/>
        <exclude name="UseObjectForClearerAPI"/>
        <exclude name="CyclomaticComplexity"/>
    </rule>
    <rule ref="category/java/documentation.xml">
        <!-- CommentRequired はここでは exclude し、下で別途定義する -->
        <exclude name="CommentRequired"/>
        <exclude name="UncommentedEmptyMethodBody"/>
        <!-- CommentSize はここでは exclude し、下で別途定義する -->
        <exclude name="CommentSize"/>
    </rule>
    <rule ref="category/java/documentation.xml/CommentRequired">
        <properties>
            <property name="fieldCommentRequirement" value="Ignored"/>
            <property name="enumCommentRequirement" value="Ignored"/>
        </properties>
    </rule>
    <rule ref="category/java/documentation.xml/CommentSize">
        <properties>
            <property name="maxLineLength" value="120"/>
        </properties>
    </rule>
    <rule ref="category/java/errorprone.xml">
        <exclude name="DataflowAnomalyAnalysis"/>
        <exclude name="BeanMembersShouldSerialize"/>
        <exclude name="MissingStaticMethodInNonInstantiatableClass"/>
    </rule>
    <rule ref="category/java/multithreading.xml"/>
    <rule ref="category/java/performance.xml"/>
    <rule ref="category/java/security.xml"/>
</ruleset>

ちなみに clean タスク実行 → Rebuild Project 実行 → build タスクを実行するとこうなります。

f:id:ksby:20180603235112p:plain

履歴

2018/06/04
初版発行。