1. 程式人生 > >Intellij IDEA 使用checkstyle、pmd、findbugs檢查靜態程式碼質量

Intellij IDEA 使用checkstyle、pmd、findbugs檢查靜態程式碼質量

checkstye、pmd、findbugs的對比
在這裡插入圖片描述

在IDEA setting-plugins 下分別搜尋 checkstyle、pmd、findbugs 安裝,安裝後要重啟IDEA。

  1. checkstyle
    在這裡插入圖片描述
    如上圖開啟checkstyle面板。
    可以自己設定檢查規則,在setting-other setting-Checkstyle,點選右上角+號新增自己的檢查規則。下面是一個規則例子
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.3//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_3.dtd">

<!--
  規則版本號:V1.0(2018-05-11)
  本規則重在程式設計規範,請與PMD、FindBugs結合使用
-->
<module name="Checker">
    <!-- 每個java檔案一個語法樹 -->
    <module name="TreeWalker">

        <!--
        Javadoc Comments2
        -->
        <!--<module name="JavadocType"/>
        <module name="JavadocMethod">
            <property name="scope" value="protected"/>
            <property name="allowMissingPropertyJavadoc " value="true"/>
            <property name="logLoadErrors" value="true"/>
            <property name="suppressLoadErrors" value="true"/>
        </module>
        <module name="JavadocVariable">
            <property name="scope" value="public"/>
        </module>
        <module name="JavadocStyle">
            <property name="checkFirstSentence" value="false"/>
            <property name="checkEmptyJavadoc" value="true"/>
            <property name="checkHtml" value="false"/>
        </module>-->

        <!--
        Naming Conventions
        -->
        <module name="ConstantName">
            <property name="format" value="(^[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$)|(^log$)|(^logger$)"/>
        </module>
        <module name="LocalFinalVariableName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>
        <module name="LocalVariableName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>
        <module name="MemberName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>
        <module name="MethodName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-zA-Z_][a-zA-Z0-9_]*)*$"/>
        </module>
        <module name="ParameterName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>
        <module name="StaticVariableName">
            <property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
        </module>
        <module name="TypeName">
            <property name="format" value="^[A-Z][a-zA-Z0-9]*$"/>
        </module>


        <!-- import -->
        <!-- 避免使用* -->
        <module name="AvoidStarImport"/>
        <!-- 檢查是否匯入了多餘的包 -->
        <module name="RedundantImport"/>
        <!-- 檢查是否從非法的包中匯入了類 -->
        <module name="IllegalImport"/>
        <!-- 沒用的import檢查 -->
        <module name="UnusedImports"/>

        <!--
       Size Violations
       -->
        <!--<module name="LineLength">
            <property name="max" value="120"/>
        </module>-->
        <module name="AnonInnerLength">
            <property name="max" value="60"/>
        </module>


        <!--
        Whitespace
        -->
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap"/>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <!--<module name="TabCharacter"/>-->
        <module name="WhitespaceAround">
            <property name="tokens" value="COLON,NOT_EQUAL,QUESTION,DIV,DIV_ASSIGN,BXOR,BXOR_ASSIGN,MINUS,LCURLY,RCURLY,STAR,STAR_ASSIGN,TYPE_EXTENSION_AND,BAND,LAND,BAND_ASSIGN,MOD,MOD_ASSIGN,PLUS,PLUS_ASSIGN,LT,SL,SL_ASSIGN,LE,ASSIGN,MINUS_ASSIGN,EQUAL,GT,GE,SR,SR_ASSIGN,BSR,BSR_ASSIGN,BOR,BOR_ASSIGN,LOR,LITERAL_ASSERT,LITERAL_ASSERT,LITERAL_CATCH,LITERAL_DO,LITERAL_ELSE,LITERAL_FINALLY,LITERAL_FOR,LITERAL_IF,LITERAL_RETURN,SLIST,LITERAL_SYNCHRONIZED,LITERAL_TRY,LITERAL_WHILE"/>
        </module>

        <!--
        Modifiers
        -->
        <module name="ModifierOrder"/>

        <!-- Block Checks -->
        <module name="EmptyBlock"/>
        <module name="LeftCurly">
            <property name="option" value="eol"/>
        </module>
        <module name="NeedBraces"/>
        <module name="RightCurly">
            <property name="option" value="alone"/>
        </module>
        <module name="AvoidNestedBlocks">
            <property name="allowInSwitchCase" value="true"/>
        </module>


        <!-- Coding -->
        <!-- 檢查區域性變數或引數是否隱藏了類中的變數 -->
        <module name="HiddenField">
            <property name="ignoreConstructorParameter" value="true"/>
            <property name="ignoreSetter" value="true"/>
            <property name="ignoreAbstractMethods" value="true"/>
        </module>
        <!-- 檢查是否有"魔鬼"數字 -->
        <module name="MagicNumber">
            <property name="tokens" value="NUM_DOUBLE, NUM_FLOAT, NUM_LONG"/>
            <property name="ignoreNumbers" value="-1, 0, 1"/>
        </module>
        <!-- <module name="RedundantThrows">
            <property name="logLoadErrors" value="true"/>
            <property name="suppressLoadErrors" value="true"/>
        </module>-->
        <module name="NestedTryDepth">
            <property name="max" value="2"/>
        </module>
        <module name="IllegalThrows"/>
        <module name="DeclarationOrder"/>
        <module name="UnnecessaryParentheses"/>

        <!-- Class Design -->
        <module name="VisibilityModifier">
            <property name="packageAllowed" value="true"/>
            <property name="protectedAllowed" value="true"/>
        </module>
        <!--<module name="HideUtilityClassConstructor"/>    -->
        <module name="ThrowsCount">
            <property name="max" value="3"/>
        </module>

        <!-- Metrics -->
        <module name="BooleanExpressionComplexity">
            <property name="max" value="5"/>
        </module>

        <!-- Miscellaneous -->
        <!--<module name="Indentation"/>-->
        <module name="UncommentedMain"/>
    </module>
</module>

在checkstyle面板,點選檢查按鈕進行檢查,也可以檢查單個檔案。
在這裡插入圖片描述

  1. pmd的使用
    在這裡插入圖片描述

  2. findbugs的使用
    在這裡插入圖片描述