Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch

Überblick

Checkstyle wird von Gradle ausgeführt, und beim Ausführen von Build und Check wird eine statische Code-Analyse durchgeführt. Wenn das Analyseergebnis NG ist, wird der Build abgebrochen.

Checkstyle

GitHub URL

https://github.com/checkstyle/checkstyle

Grund für die Auswahl

Einfach zu installieren. Google hat offiziell eine Konfigurationsdatei (XML) für Google Java Style bereitgestellt, die heutzutage häufig in Open Source verwendet wird.

Inhaltsverzeichnis

  1. Fügen Sie check.gyle-Abhängigkeit zu build.gradle hinzu
  2. Platzieren Sie checkstyle.xml

Checkstyle-Abhängigkeit zu build.gradle hinzugefügt

Fügen Sie Folgendes hinzu.

//Checkstyle Plugin für statische Code Analyse mit Checkstyle
apply plugin: 'checkstyle'

//checkstyleMain und checkstyleTest werden automatisch durch Gradle Check ausgeführt
//Da die Gradle-Prüfung auch als Teil der Gradle-Erstellung funktioniert, wird der Prüfstil auch ausgeführt, wenn die Gradle-Erstellung auf CI ausgeführt wird.
def checkstyleVersion = '8.10.1'
checkstyle {
    configFile = file('checkstyle.xml')
    toolVersion = checkstyleVersion
    ignoreFailures = false
}

checkstyle.xml Platzierung

Standardmäßig wird es in src / main / resources abgelegt, aber da `configFile = file ('checkstyle.xml')` im obigen build.gradle angegeben ist, wird es direkt unter dem Stammverzeichnis des Repositorys abgelegt. .. Ich habe auf einige Open Source-Platzierungsmethoden wie RxJava verwiesen.

Inhalt von checkstyle.xml

Der Inhalt basiert mit einigen Änderungen auf Google Java Style.

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
        "https://checkstyle.org/dtds/configuration_1_3.dtd">

<!--Zeichnung aus Google Java Style geändert
Einrückungswerte von 2 bis 4,Wechseln Sie von 4 zu 8
Ändern Sie den Schweregrad von Warnung in Fehler
-->

<!--
    Checkstyle configuration that checks the Google coding conventions from Google Java Style
    that can be found at https://google.github.io/styleguide/javaguide.html.

    Checkstyle is very configurable. Be sure to read the documentation at
    http://checkstyle.sf.net (or in your downloaded distribution).

    To completely disable a check, just comment it out or delete it from the file.

    Authors: Max Vetrenko, Ruslan Diachenko, Roman Ivanov.
 -->

<module name="Checker">
    <property name="charset" value="UTF-8"/>

    <property name="severity" value="error"/>

    <property name="fileExtensions" value="java, properties, xml"/>
    <!-- Checks for whitespace                               -->
    <!-- See http://checkstyle.sf.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
    </module>

    <module name="TreeWalker">
        <module name="OuterTypeFilename"/>
        <module name="IllegalTokenText">
            <property name="tokens" value="STRING_LITERAL, CHAR_LITERAL"/>
            <property name="format"
                      value="\\u00(09|0(a|A)|0(c|C)|0(d|D)|22|27|5(C|c))|\\(0(10|11|12|14|15|42|47)|134)"/>
            <property name="message"
                      value="Consider using special escape sequence instead of octal value or Unicode escaped value."/>
        </module>
        <module name="AvoidEscapedUnicodeCharacters">
            <property name="allowEscapesForControlCharacters" value="true"/>
            <property name="allowByTailComment" value="true"/>
            <property name="allowNonPrintableEscapes" value="true"/>
        </module>
        <module name="LineLength">
            <property name="max" value="100"/>
            <property name="ignorePattern" value="^package.*|^import.*|a href|href|http://|https://|ftp://"/>
        </module>
        <module name="AvoidStarImport"/>
        <module name="OneTopLevelClass"/>
        <module name="NoLineWrap"/>
        <module name="EmptyBlock">
            <property name="option" value="TEXT"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE, LITERAL_SWITCH"/>
        </module>
        <module name="NeedBraces"/>
        <module name="LeftCurly"/>
        <module name="RightCurly">
            <property name="id" value="RightCurlySame"/>
            <property name="tokens"
                      value="LITERAL_TRY, LITERAL_CATCH, LITERAL_FINALLY, LITERAL_IF, LITERAL_ELSE,
                    LITERAL_DO"/>
        </module>
        <module name="RightCurly">
            <property name="id" value="RightCurlyAlone"/>
            <property name="option" value="alone"/>
            <property name="tokens"
                      value="CLASS_DEF, METHOD_DEF, CTOR_DEF, LITERAL_FOR, LITERAL_WHILE, STATIC_INIT,
                    INSTANCE_INIT"/>
        </module>
        <module name="WhitespaceAround">
            <property name="allowEmptyConstructors" value="true"/>
            <property name="allowEmptyMethods" value="true"/>
            <property name="allowEmptyTypes" value="true"/>
            <property name="allowEmptyLoops" value="true"/>
            <message key="ws.notFollowed"
                     value="WhitespaceAround: ''{0}'' is not followed by whitespace. Empty blocks may only be represented as '{}' when not part of a multi-block statement (4.1.3)"/>
            <message key="ws.notPreceded"
                     value="WhitespaceAround: ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="OneStatementPerLine"/>
        <module name="MultipleVariableDeclarations"/>
        <module name="ArrayTypeStyle"/>
        <module name="MissingSwitchDefault"/>
        <module name="FallThrough"/>
        <module name="UpperEll"/>
        <module name="ModifierOrder"/>
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapDot"/>
            <property name="tokens" value="DOT"/>
            <property name="option" value="nl"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapComma"/>
            <property name="tokens" value="COMMA"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <!-- ELLIPSIS is EOL until https://github.com/google/styleguide/issues/258 -->
            <property name="id" value="SeparatorWrapEllipsis"/>
            <property name="tokens" value="ELLIPSIS"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <!-- ARRAY_DECLARATOR is EOL until https://github.com/google/styleguide/issues/259 -->
            <property name="id" value="SeparatorWrapArrayDeclarator"/>
            <property name="tokens" value="ARRAY_DECLARATOR"/>
            <property name="option" value="EOL"/>
        </module>
        <module name="SeparatorWrap">
            <property name="id" value="SeparatorWrapMethodRef"/>
            <property name="tokens" value="METHOD_REF"/>
            <property name="option" value="nl"/>
        </module>
        <module name="PackageName">
            <property name="format" value="^[a-z]+(\.[a-z][a-z0-9]*)*$"/>
            <message key="name.invalidPattern"
                     value="Package name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="TypeName">
            <message key="name.invalidPattern"
                     value="Type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MemberName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9]*$"/>
            <message key="name.invalidPattern"
                     value="Member name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="CatchParameterName">
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Catch parameter name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="LocalVariableName">
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
            <message key="name.invalidPattern"
                     value="Local variable name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="ClassTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Class type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="MethodTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Method type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="InterfaceTypeParameterName">
            <property name="format" value="(^[A-Z][0-9]?)$|([A-Z][a-zA-Z0-9]*[T]$)"/>
            <message key="name.invalidPattern"
                     value="Interface type name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="NoFinalizer"/>
        <module name="GenericWhitespace">
            <message key="ws.followed"
                     value="GenericWhitespace ''{0}'' is followed by whitespace."/>
            <message key="ws.preceded"
                     value="GenericWhitespace ''{0}'' is preceded with whitespace."/>
            <message key="ws.illegalFollow"
                     value="GenericWhitespace ''{0}'' should followed by whitespace."/>
            <message key="ws.notPreceded"
                     value="GenericWhitespace ''{0}'' is not preceded with whitespace."/>
        </module>
        <module name="Indentation">
            <property name="basicOffset" value="4"/>
            <property name="braceAdjustment" value="0"/>
            <property name="caseIndent" value="4"/>
            <property name="throwsIndent" value="8"/>
            <property name="lineWrappingIndentation" value="8"/>
            <property name="arrayInitIndent" value="4"/>
        </module>
        <module name="AbbreviationAsWordInName">
            <property name="ignoreFinal" value="false"/>
            <property name="allowedAbbreviationLength" value="1"/>
        </module>
        <module name="OverloadMethodsDeclarationOrder"/>
        <module name="VariableDeclarationUsageDistance"/>
        <module name="CustomImportOrder">
            <property name="sortImportsInGroupAlphabetically" value="true"/>
            <property name="separateLineBetweenGroups" value="true"/>
            <property name="customImportOrderRules" value="STATIC###THIRD_PARTY_PACKAGE"/>
        </module>
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceBefore">
            <property name="tokens"
                      value="COMMA, SEMI, POST_INC, POST_DEC, DOT, ELLIPSIS, METHOD_REF"/>
            <property name="allowLineBreaks" value="true"/>
        </module>
        <module name="ParenPad"/>
        <module name="OperatorWrap">
            <property name="option" value="NL"/>
            <property name="tokens"
                      value="BAND, BOR, BSR, BXOR, DIV, EQUAL, GE, GT, LAND, LE, LITERAL_INSTANCEOF, LOR,
                    LT, MINUS, MOD, NOT_EQUAL, PLUS, QUESTION, SL, SR, STAR, METHOD_REF "/>
        </module>
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationMostCases"/>
            <property name="tokens"
                      value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF"/>
        </module>
        <module name="AnnotationLocation">
            <property name="id" value="AnnotationLocationVariables"/>
            <property name="tokens" value="VARIABLE_DEF"/>
            <property name="allowSamelineMultipleAnnotations" value="true"/>
        </module>
        <module name="NonEmptyAtclauseDescription"/>
        <module name="JavadocTagContinuationIndentation"/>
        <module name="SummaryJavadoc">
            <property name="forbiddenSummaryFragments"
                      value="^@return the *|^This method returns |^A [{]@code [a-zA-Z0-9]+[}](isa)"/>
        </module>
        <module name="JavadocParagraph"/>
        <module name="AtclauseOrder">
            <property name="tagOrder" value="@param, @return, @throws, @deprecated"/>
            <property name="target"
                      value="CLASS_DEF, INTERFACE_DEF, ENUM_DEF, METHOD_DEF, CTOR_DEF, VARIABLE_DEF"/>
        </module>
        <module name="JavadocMethod">
            <property name="scope" value="public"/>
            <property name="allowMissingParamTags" value="true"/>
            <property name="allowMissingThrowsTags" value="true"/>
            <property name="allowMissingReturnTag" value="true"/>
            <property name="minLineCount" value="2"/>
            <property name="allowedAnnotations" value="Override, Test"/>
            <property name="allowThrowsTagsForSubclasses" value="true"/>
        </module>
        <module name="MethodName">
            <property name="format" value="^[a-z][a-z0-9][a-zA-Z0-9_]*$"/>
            <message key="name.invalidPattern"
                     value="Method name ''{0}'' must match pattern ''{1}''."/>
        </module>
        <module name="SingleLineJavadoc">
            <property name="ignoreInlineTags" value="false"/>
        </module>
        <module name="EmptyCatchBlock">
            <property name="exceptionVariableName" value="expected"/>
        </module>
        <module name="CommentsIndentation"/>
    </module>
</module>

Recommended Posts

Führen Sie eine statische Code-Analyse mit Checkstyle mit Java + Gradle durch
Morphologische Analyse in Java mit Kuromoji
Verwenden Sie statische Analysewerkzeuge in Ihrem Gradle-Projekt
Erstellen Sie mit Gradle mit VSCode Java → Ausführen
Fügen Sie das Bild mit der statischen Java-Methode in die JAR-Datei ein
Überprüfen Sie die Abdeckung mit Codecov in der Java + Gradle + Wercker-Konfiguration
Erstellen Sie mit Gradle ein Java-Multiprojekt
[Java] JavaConfig mit statischer innerer Klasse
Themenanalyse (LDA) in Java
Java mit Visual Studio Code
Schreiben Sie Java8-ähnlichen Code in Java8
Protokollaggregation und -analyse (Arbeiten mit AWS Athena in Java)
Erweiterter Java-Kompilierungsfehler mit dem statischen Analysetool ErrorProne
Errate den Zeichencode in Java
Erstellen eines Java-Projekts mit Gradle
Mach HelloWorld mit Java / IntelliJ / Gradle
Code Java von Emacs mit Eclim
Erstellen Sie Java mit Mac vs Code
Führen Sie gepackten Java-Code mit Befehlen aus
Führen Sie eine Phrasenanalyse in Java 8 durch (Teil 2).
1 Implementieren Sie eine einfache Phrasenanalyse in Java
Tweak Markdown mit Java Flexmark-Java
Erstellen einer Phrasenanalyse in Java 8 (Teil 1)
Hallo Welt in Java und Gradle
Einfache Codeüberprüfung für den Einstieg in Jenkins / SonarQube: Statische Analyse
Bereiten Sie die Java-Entwicklungsumgebung mit VS Code vor
[Java] Erstellen Sie mit Gradle ein ausführbares Modul
Java statisch
Verknüpfen Sie Java- und C ++ - Code mit SWIG
Parallelitätsmethode in Java mit grundlegendem Beispiel
CICS-Java-Anwendung ausführen- (3) Build-Management mit Gradle
[JaCoCo (Java Code Coverage)] Verwendung mit NetBeans
Lesen Sie die xlsx-Datei in Java mit Selenium
Alle gleichen Hash-Code-Zeichenfolgen in Java
Teilen Sie eine Zeichenfolge in Java mit ". (Dot)"
Behandeln Sie große JSON mit Java Lambda
Konfigurieren Sie ein Multiprojekt mit Unterverzeichnissen in Gradle
Einführung eines automatisierten Java-Tests mit JUnit 5 + Gradle
[Mac] Installieren Sie Java in Visual Studio Code
Führen Sie Java-Code von cpp auf cocos2dx aus
Versuchen Sie das Remote-Debuggen von Java mit Remote-Containern in Visual Studio Code Insiders
Statische Analyse ausführen In der Windows-Umgebung ableiten
In einigen Fällen habe ich Java-Code mit GraalVM nativ gemacht, ihn aber nicht beschleunigt.
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Erstellen Sie eine CSR mit erweiterten Informationen in Java
Fügen Sie in Java in Visual Studio Code die Option --enable-Preview hinzu
Überarbeitetes GUI-Tool, das 2016 mit Java8 + JavaFX erstellt wurde
Techniken zum Lesen von Java-Quellcode in Eclipse
[Gradle] Build-Vorgänge, die häufig in Java-Projekten ausgeführt werden
Code zum Escapezeichen von JSON-Zeichenfolgen in Java
Erstellen und testen Sie Java + Gradle-Anwendungen mit Wercker
Versuchen Sie es mit Sourcetrail (Win-Version) mit Java-Code
Textextraktion in Java aus PDF mit pdfbox-2.0.8
Versuchen Sie es mit Sourcetrail (MacOS-Version) mit Java-Code
Komfortablere Java-Codeabdeckung mit Jacoco 0.8.0
Ändern Sie dynamisch private statische Endfelder in Java
Überprüfen Sie das statische und öffentliche Verhalten in Java-Methoden
Java-Tipps - Erstellen Sie mit Gradle ein Spring Boot-Projekt
[AtCoder Problem-ABC001] C-Do Windbeobachtung in Java [Code]