Apache Maven. Checkstyle Plugin

From AsIsWiki
(Difference between revisions)
Jump to: navigation, search
(Created page with "<div style='max-width:700px;text-align:justify;'> Apache Maven ==Checkstyle Plugin== 1. Создаем Maven-проект в IntelliJ IDEA: <pre> File / New / Project....")
 
 
Line 92: Line 92:
  
  
3. В папку ~/projects/web/CheckstyleTest (рядом с pom.xml) добавляем конфигурационные файлы:
+
3. В папку '''~/projects/web/CheckstyleTest''' (рядом с '''pom.xml''') добавляем конфигурационные файлы:
  
 
'''checkstyle.xml''' - конфигурация правил проверки:
 
'''checkstyle.xml''' - конфигурация правил проверки:

Latest revision as of 12:08, 31 March 2016

Apache Maven


[edit] Checkstyle Plugin

1. Создаем Maven-проект в IntelliJ IDEA:

File / New / Project... 

Maven
Project SDK: 1.8 

[Next]

GroupId: org.asistech.web.cstest
ArtifactId: CheckstyleTest
Version: 1.0

[Next]

Project name: CheckstyleTest
Project location: ~/projects/web/CheckstyleTest

[Finish]


Структура проекта:

CheckstyleTest1.png


2. В файле pom.xml подключаем и конфигурируем maven-checkstyle-plugin:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="
            http://maven.apache.org/POM/4.0.0
            http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>org.asistech.web.cstest</groupId>
    <artifactId>CheckstyleTest</artifactId>
    <version>1.0</version>

    <properties>
        <checkstyle.version>6.11.2</checkstyle.version>
        <checkstyle.plugin.version>2.17</checkstyle.plugin.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
                <version>${checkstyle.plugin.version}</version>
                <dependencies>
                    <dependency>
                        <groupId>com.puppycrawl.tools</groupId>
                        <artifactId>checkstyle</artifactId>
                        <version>${checkstyle.version}</version>
                    </dependency>
                </dependencies>
                <configuration>
                    <configLocation>checkstyle.xml</configLocation>
                    <suppressionsLocation>checkstyle_suppress.xml</suppressionsLocation>
                    <consoleOutput>true</consoleOutput>
                    <failsOnError>true</failsOnError>
                    <failOnViolation>true</failOnViolation>
                    <outputFileFormat>xml</outputFileFormat>
                    <includeTestSourceDirectory>true</includeTestSourceDirectory>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>


3. В папку ~/projects/web/CheckstyleTest (рядом с pom.xml) добавляем конфигурационные файлы:

checkstyle.xml - конфигурация правил проверки:

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.2//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">

<module name="Checker">

    <module name="SuppressWarningsFilter"/>

    <module name="TreeWalker">
        
        <property name="tabWidth" value="4"/>

        <!-- Checks for Annotations -->
        <!-- See http://checkstyle.sourceforge.net/config_annotation.html -->
        <module name="AnnotationUseStyle"/>
        <module name="MissingDeprecated"/>
        <module name="MissingOverride"/>
        <module name="PackageAnnotation"/>
        <module name="SuppressWarningsHolder"/>
        <module name="AnnotationLocation">
            <property name="allowSamelineMultipleAnnotations" value="false"/>
            <property name="allowSamelineSingleParameterlessAnnotation" value="true"/>
            <property name="allowSamelineParameterizedAnnotation" value="false"/>
        </module>

        <!-- Checks for Block -->
        <!-- See http://checkstyle.sourceforge.net/config_blocks.html -->
        <module name="EmptyBlock">
            <property name="option" value="text"/>
        </module>
        <module name="EmptyCatchBlock"/>
        <module name="LeftCurly"/>
        <module name="RightCurly"/>
        <module name="AvoidNestedBlocks"/>

        <!-- Checks for Class Design -->
        <!-- See http://checkstyle.sourceforge.net/config_design.html -->
        <module name="VisibilityModifier">
            <property name="protectedAllowed" value="true"/>
            <property name="packageAllowed" value="true"/>
            <property name="ignoreAnnotationCanonicalNames"
                      value="org.junit.ClassRule, org.junit.Rule, 
                      com.google.common.annotations.VisibleForTesting"/>
        </module>
        <module name="FinalClass"/>
        <module name="InterfaceIsType"/>
        <module name="HideUtilityClassConstructor"/>
        <module name="ThrowsCount">
            <property name="max" value="3"/>
        </module>
        <module name="InnerTypeLast"/>
        <module name="OneTopLevelClass"/>

        <!-- Checks for Coding -->
        <!-- See http://checkstyle.sourceforge.net/config_coding.html -->
        <module name="CovariantEquals"/>
        <module name="EmptyStatement"/>
        <module name="EqualsAvoidNull"/>
        <module name="EqualsHashCode"/>
        <module name="HiddenField">
            <property name="ignoreSetter" value="true"/>
            <property name="ignoreConstructorParameter" value="true"/>
            <property name="setterCanReturnItsClass" value="true"/>
            <property name="tokens" value="VARIABLE_DEF"/>
        </module>
        <module name="InnerAssignment"/>
        <module name="MagicNumber">
            <property name="ignoreNumbers"
                      value="-4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 
                      14, 15, 16, 24, 31, 32, 60, 64, 100, 128, 256, 512, 1000, 1024"/>
            <property name="ignoreHashCodeMethod" value="true"/>
            <property name="ignoreAnnotation" value="true"/>
        </module>
        <module name="MissingSwitchDefault"/>
        <module name="ModifiedControlVariable"/>
        <module name="SimplifyBooleanExpression"/>
        <module name="SimplifyBooleanReturn"/>
        <module name="StringLiteralEquality"/>
        <module name="NestedForDepth">
            <property name="max" value="3"/>
        </module>
        <module name="NestedIfDepth">
            <property name="max" value="4"/>
        </module>
        <module name="NestedTryDepth">
            <property name="max" value="2"/>
        </module>
        <module name="IllegalThrows"/>
        <module name="PackageDeclaration"/>
        <module name="DeclarationOrder"/>
        <module name="ParameterAssignment"/>
        <module name="ExplicitInitialization"/>
        <module name="DefaultComesLast"/>
        <module name="MultipleVariableDeclarations"/>
        <module name="UnnecessaryParentheses"/>
        <module name="OneStatementPerLine"/>
        <module name="OverloadMethodsDeclarationOrder"/>

        <!-- Checks for Imports -->
        <!-- See http://checkstyle.sourceforge.net/config_imports.html -->
        <module name="AvoidStarImport"/>
        <module name="IllegalImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>

        <!-- Checks for Javadoc -->
        <!-- See http://checkstyle.sourceforge.net/config_javadoc.html -->
        <module name="JavadocStyle"/>
        <module name="NonEmptyAtclauseDescription"/>
        <module name="JavadocTagContinuationIndentation"/>
        <module name="AtclauseOrder"/>

        <!-- Miscellaneous other checks -->
        <!-- See http://checkstyle.sourceforge.net/config_misc.html -->
        <module name="TodoComment">
            <property name="severity" value="warning"/>
        </module>
        <module name="UncommentedMain"/>
        <module name="UpperEll"/>
        <module name="ArrayTypeStyle"/>
        <module name="Indentation"/>
        <module name="OuterTypeFilename"/>

        <!-- Checks for Modifiers -->
        <!-- See http://checkstyle.sourceforge.net/config_modifier.html -->
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>

        <!-- Checks for Naming Conventions -->
        <!-- See http://checkstyle.sourceforge.net/config_naming.html -->
        <module name="ClassTypeParameterName">
            <property name="format" value="^[A-Z]+[0-9]?$"/>
        </module>
        <module name="ConstantName">
            <property name="format" value="^log(ger)?|[A-Z][A-Z0-9]*(_[A-Z0-9]+)*$"/>
        </module>
        <module name="LocalFinalVariableName"/>
        <module name="LocalVariableName"/>
        <module name="MemberName"/>
        <module name="MethodName"/>
        <module name="MethodTypeParameterName">
            <property name="format" value="^[A-Z]+[0-9]?$"/>
        </module>
        <module name="InterfaceTypeParameterName">
            <property name="format" value="^[A-Z]+[0-9]?$"/>
        </module>
        <module name="PackageName"/>
        <module name="ParameterName"/>
        <module name="TypeName"/>

        <!-- Checks Size Violations -->
        <!-- See http://checkstyle.sourceforge.net/config_sizes.html -->
        <module name="LineLength">
            <property name="max" value="180"/>
            <property name="ignorePattern" value="@version|@see|@todo|TODO"/>
        </module>
        <module name="AnonInnerLength">
            <property name="max" value="60"/>
        </module>
        <module name="ParameterNumber"/>
        <module name="OuterTypeNumber"/>

        <!-- Checks for Whitespaces -->
        <!-- See http://checkstyle.sourceforge.net/config_whitespace.html -->
        <module name="GenericWhitespace"/>
        <module name="EmptyForInitializerPad"/>
        <module name="EmptyForIteratorPad">
            <property name="option" value="space"/>
        </module>
        <module name="MethodParamPad"/>
        <module name="NoWhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
        <module name="OperatorWrap">
            <property name="option" value="eol"/>
        </module>
        <module name="ParenPad"/>
        <module name="TypecastParenPad"/>
        <module name="WhitespaceAfter">
            <property name="tokens" value="COMMA, SEMI"/>
        </module>
        <module name="WhitespaceAround"/>
        <module name="NoLineWrap"/>
        <module name="EmptyLineSeparator">
            <property name="allowNoEmptyLineBetweenFields" value="true"/>
        </module>
        <module name="SeparatorWrap">
            <property name="option" value="nl"/>
            <property name="tokens" value="DOT"/>
        </module>
        
    </module>

    <!-- Regexp checks -->
    <!-- See http://checkstyle.sourceforge.net/config_regexp.html -->
    <module name="RegexpMultiline">
        <property name="format" value="\r?\n[ \t\x0B\f]*\r?\n[ \t\x0B\f]*\r?\n"/>
        <property name="fileExtensions" value="java"/>
        <property name="message" value="Two consecutive empty lines"/>
    </module>

    <!-- See http://checkstyle.sourceforge.net/config_whitespace.html -->
    <module name="FileTabCharacter">
        <property name="eachLine" value="true"/>
        <property name="fileExtensions" value=".java"/>
    </module>

</module>

checkstyle_suppress.xml - список ресурсов, не подлежащих проверке:

<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC "-//Puppy Crawl//DTD Suppressions 1.1//EN"
        "http://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>

</suppressions>


3. Добавляем в папку ~/projects/web/CheckstyleTest/src/main/java класс Main.java:

/**
 * Checkstyle test
 */
public class Main {

    public static void main(String[] args) {
        System.out.println("Good checkstyle!");
    }
}


4. Конфигурируем запуск проекта:

Run / Edit Configurations... / + / Applications

Name: Main
Main class: Main
Working directory: /Users/alex/projects/web/CheckstyleTest
Use classpath of module: CheckstyleTest

[OK]


5. Запуск проекта приведет к успешной компиляции, и программа выведет в консоль сообщение:

Good checkstyle!


6. Чтобы проверить соответствие стиля программы перечисленным в checkstyle.xml правилам, необходимо выполнить сборку проекта в maven:

переходим в папку проекта:
cd ~/projects/web/CheckstyleTest

выполняем сборку:
mvn clean install


Checkstyle сообщит о следующих ошибках:

Main.java:1: error: First sentence should end with a period.
Main.java:4: error: Missing package declaration.
Main.java:4:1: error: Utility classes should not have a public or default constructor.
Main.java:6: error: Uncommented main method found.
Audit done.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE


First sentence should end with a period. - требует поставить точку в первой строке комментария:

/**
 * Checkstyle test.
 */

Missing package declaration. - необходимо перенести класс Main.java в пакет, например:

src/main/java/org/asistech/web/cstest/Main.java

Utility classes should not have a public or default constructor. - требует запретить создание экземпляров и наследников от класса Main. Исправляем:

package org.asistech.web.cstest;

/**
 * Checkstyle test.
 */
public final class Main {

    private Main() {

    }
    
    public static void main(String[] args) {
        System.out.println("Good checkstyle!");
    }
}

Uncommented main method found. - в checkstyle.xml добавляем исключение из правила UncommentedMain:

<module name="TreeWalker">
    
    ...
    
    <module name="UncommentedMain">
        <property name="excludedClasses" value="\.Main$"/>
    </module>

</module>


7. Выполняем повторную сборку проекта:



Apache Maven

Personal tools
Namespaces

Variants
Actions
Navigation
Tools