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 へバージョンアップします。前回からの続きです。
参照したサイト・書籍
目次
- category/java/documentation.xml
- category/java/errorprone.xml
- category/java/multithreading.xml
- category/java/performance.xml
- category/java/security.xml
- 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 タスクを実行するとこうなります。
履歴
2018/06/04
初版発行。