Apache Maven. Checkstyle Plugin
(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
[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]
Структура проекта:
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. Выполняем повторную сборку проекта: