IntelliJ?IDEA中如何使用Checkstyle對(duì)Java代碼規(guī)范檢查
前言
本文介紹使用CheckStyle 對(duì)java 代碼進(jìn)行規(guī)范限制。
一、Checkstyle是什么?
Checkstyle 是一款開源的代碼靜態(tài)檢查工具,主要用于 強(qiáng)制遵循代碼規(guī)范(如命名規(guī)則、代碼格式、注釋要求等),支持 Java 等語(yǔ)言。它通過預(yù)定義或自定義的規(guī)則集,自動(dòng)檢測(cè)代碼中不符合規(guī)范的問題(如類名未用 PascalCase、方法缺少 Javadoc 注釋、多余的空行等),幫助團(tuán)隊(duì)統(tǒng)一編碼風(fēng)格、提升代碼可讀性和可維護(hù)性
官網(wǎng)介紹:https://checkstyle.sourceforge.io/
二、Checkstyle 在idea 中如何配置:
2.1.idea Checkstyle 插件安裝
IDEA,進(jìn)入 File -> Settings -> Plugins,在搜索框輸入 Checkstyle,找到官方插件(通常名為 Checkstyle-IDEA),點(diǎn)擊 Install 安裝,重啟 IDEA 生效

2.2 配置 Checkstyle 規(guī)則集:
IntelliJ IDEA -> Settings -> Tools -> Checkstyle 在 Configuration File 區(qū)域配置檢查規(guī)則
在項(xiàng)目根目錄新增checkstyle.xml 的配置規(guī)則:

checkstyle.xml校驗(yàn)的內(nèi)容為:
<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
"-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
"https://checkstyle.org/dtds/configuration_1_3.dtd">
<!-- Copyright (C) 2019 check Holding Ltd. All Rights Reserved. -->
<module name="Checker">
<property name="charset" value="UTF-8"/>
<property name="severity" value="error"/>
<property name="fileExtensions" value="java, properties, xml"/>
<!-- Headers Begin -->
<!-- See https://checkstyle.sourceforge.io/config_header.html -->
<!-- <module name="RegexpHeader">-->
<!-- <property name="header" value="Copyright \(C\) \d{4} check Holding Ltd. All Rights Reserved.$"/>-->
<!-- </module>-->
<!-- Headers End -->
<!-- Miscellaneous Begin -->
<!-- See https://checkstyle.sourceforge.io/config_misc.html -->
<module name="UniqueProperties"/>
<!-- Miscellaneous End -->
<!-- Size Violations Begin -->
<!-- See https://checkstyle.sourceforge.io/config_sizes.html -->
<module name="FileLength"/>
<module name="LineLength">
<property name="max" value="120"/>
<!-- Ignore all imports -->
<property name="ignorePattern" value="^import "/>
</module>
<!-- Size Violations End -->
<!-- Whitespace Begin -->
<!-- See https://checkstyle.sourceforge.io/config_whitespace.html -->
<module name="FileTabCharacter">
<property name="eachLine" value="true"/>
</module>
<!-- Whitespace End -->
<module name="TreeWalker">
<!-- Annotations Begin -->
<!-- See https://checkstyle.sourceforge.io/config_annotation.html -->
<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="AnnotationLocation"/>
<module name="MissingOverride"/>
<!-- Make the @SuppressWarnings annotations available to Checkstyle -->
<module name="SuppressWarningsHolder"/>
<!-- Annotations End -->
<!-- Block Checks Begin -->
<!-- See https://checkstyle.sourceforge.io/config_blocks.html -->
<module name="AvoidNestedBlocks"/>
<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="EmptyCatchBlock">
<property name="exceptionVariableName" value="expected"/>
</module>
<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="NeedBraces"/>
<!-- Block Checks End -->
<!-- Class Design Begin -->
<!-- See https://checkstyle.sourceforge.io/config_design.html -->
<module name="InterfaceIsType"/>
<!-- <module name="MutableException"/>-->
<module name="OneTopLevelClass"/>
<module name="ThrowsCount"/>
<!-- Class Design End -->
<!-- Coding Begin -->
<!-- See https://checkstyle.sourceforge.io/config_coding.html -->
<!-- <module name="AvoidDoubleBraceInitialization"/>-->
<module name="AvoidNoArgumentSuperConstructorCall"/>
<module name="CovariantEquals"/>
<module name="DefaultComesLast"/>
<module name="EmptyStatement"/>
<module name="EqualsHashCode"/>
<module name="FallThrough"/>
<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="InnerAssignment"/>
<module name="MissingSwitchDefault"/>
<module name="MultipleVariableDeclarations"/>
<module name="NestedForDepth">
<property name="max" value="3"/>
</module>
<module name="NestedIfDepth">
<property name="max" value="3"/>
</module>
<module name="NestedTryDepth">
<property name="max" value="2"/>
</module>
<module name="NoClone"/>
<module name="NoFinalizer"/>
<module name="OneStatementPerLine"/>
<module name="OverloadMethodsDeclarationOrder"/>
<module name="PackageDeclaration"/>
<!-- <module name="ParameterAssignment"/>-->
<module name="SimplifyBooleanExpression"/>
<module name="SimplifyBooleanReturn"/>
<module name="StringLiteralEquality"/>
<!-- <module name="UnnecessaryParentheses"/>-->
<module name="UnnecessarySemicolonAfterTypeMemberDeclaration"/>
<module name="UnnecessarySemicolonInTryWithResources"/>
<module name="VariableDeclarationUsageDistance"/>
<!-- Coding End -->
<!-- Imports Begin -->
<!-- See https://checkstyle.sourceforge.io/config_imports.html -->
<module name="AvoidStarImport"/>
<module name="IllegalImport"/> <!-- defaults to sun.* packages -->
<module name="ImportOrder">
<property name="groups" value="java,javax,org,com"/>
<property name="ordered" value="true"/>
<property name="separated" value="true"/>
<property name="option" value="TOP"/>
</module>
<module name="RedundantImport"/>
<module name="UnusedImports"/>
<!-- Imports End -->
<!-- Javadoc Comments Begin -->
<!-- See https://checkstyle.sourceforge.io/config_javadoc.html -->
<module name="JavadocParagraph">
<property name="allowNewlineParagraph" value="false"/>
</module>
<module name="JavadocStyle">
<property name="checkFirstSentence" value="false"/>
</module>
<module name="JavadocTagContinuationIndentation"/>
<module name="JavadocType">
<property name="scope" value="public"/>
</module>
<module name="MissingJavadocType"/>
<module name="NonEmptyAtclauseDescription"/>
<module name="SingleLineJavadoc">
<property name="ignoreInlineTags" value="false"/>
</module>
<module name="SummaryJavadoc">
<property name="period" value=""/>
</module>
<!-- Javadoc Comments End -->
<!-- Metrics Begin -->
<!-- See https://checkstyle.sourceforge.io/config_metrics.html -->
<module name="BooleanExpressionComplexity">
<property name="max" value="7"/>
</module>
<!-- <module name="ClassDataAbstractionCoupling">-->
<!-- <property name="excludeClassesRegexps" value=".*Response$,.*Request$"/>-->
<!-- </module>-->
<!-- <module name="ClassFanOutComplexity">-->
<!-- <property name="excludeClassesRegexps" value=".*Response$,.*Request$"/>-->
<!-- </module>-->
<module name="CyclomaticComplexity"/>
<!-- <module name="JavaNCSS"/>-->
<!-- Metrics End -->
<!-- Miscellaneous Begin -->
<!-- See https://checkstyle.sourceforge.io/config_misc.html -->
<module name="ArrayTypeStyle"/>
<module name="AvoidEscapedUnicodeCharacters">
<property name="allowEscapesForControlCharacters" value="true"/>
<property name="allowByTailComment" value="true"/>
<property name="allowNonPrintableEscapes" value="true"/>
</module>
<module name="CommentsIndentation"/>
<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="OuterTypeFilename"/>
<module name="UpperEll"/>
<!-- Miscellaneous End -->
<!-- Modifiers Begin -->
<!-- See https://checkstyle.sourceforge.io/config_modifier.html -->
<module name="ModifierOrder"/>
<!-- Modifiers End -->
<!-- Naming Conventions Begin -->
<!-- See https://checkstyle.sourceforge.io/config_naming.html -->
<!-- <module name="AbbreviationAsWordInName">-->
<!-- <property name="ignoreFinal" value="false"/>-->
<!-- <property name="allowedAbbreviationLength" value="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="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="ConstantName"/>
<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="LambdaParameterName">
<property name="format" value="^[a-z]([a-z0-9][a-zA-Z0-9]*)?$"/>
<message key="name.invalidPattern"
value="Lambda 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="MemberName">
<property name="format" value="^[a-z][a-zA-Z0-9]*$"/>
<message key="name.invalidPattern"
value="Member name ''{0}'' must match pattern ''{1}''."/>
</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="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="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="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="TypeName">
<message key="name.invalidPattern"
value="Type name ''{0}'' must match pattern ''{1}''."/>
</module>
<!-- Naming Conventions End -->
<!-- Size Violations Begin -->
<!-- See https://checkstyle.sourceforge.io/config_sizes.html -->
<module name="AnonInnerLength"/>
<!-- <module name="ExecutableStatementCount"/>-->
<module name="MethodCount"/>
<module name="MethodLength">
<property name="max" value="200"/>
</module>
<module name="OuterTypeNumber"/>
<module name="ParameterNumber">
<property name="max" value="9"/>
</module>
<!-- Size Violations End -->
<!-- Whitespace Begin -->
<!-- See https://checkstyle.sourceforge.io/config_whitespace.html -->
<module name="EmptyLineSeparator">
<property name="allowNoEmptyLineBetweenFields" value="true"/>
</module>
<module name="GenericWhitespace"/>
<module name="MethodParamPad"/>
<module name="NoLineWrap"/>
<module name="NoWhitespaceAfter"/>
<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="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="ParenPad"/>
<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="SingleSpaceSeparator"/>
<module name="TypecastParenPad"/>
<module name="WhitespaceAfter"/>
<module name="WhitespaceAround">
<property name="allowEmptyConstructors" value="true"/>
<property name="allowEmptyMethods" value="true"/>
<property name="allowEmptyTypes" value="true"/>
<property name="allowEmptyLoops" value="true"/>
<property name="ignoreEnhancedForColon" value="false"/>
<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>
<!-- Whitespace End -->
<module name="SuppressionCommentFilter"/>
</module>
<module name="SuppressWarningsFilter"/>
</module>
添加本地的checkstyle 文件

最后勾選 要使用的校驗(yàn)文件,進(jìn)行apply:

2.3 idea 中配置java 的import 順序:
Editor->code Style->Java->imports 配置 導(dǎo) 包順序
(1)配置imports 都以單個(gè)文件進(jìn)行導(dǎo)入

(2)配置導(dǎo)包的屬性:

2.4 去除idea 本身保存時(shí)的格式化

三、Checkstyle 在idea 中如何使用:
配置完成后,在編寫代碼時(shí),會(huì)進(jìn)行實(shí)時(shí)校驗(yàn),鼠標(biāo)懸停可以查看提示

也可以在某個(gè)文件中,右鍵check 文件

回對(duì)該文件進(jìn)行檢查并輸出:

可以使用 代碼格式化的快捷鍵: Ctrl+Alt+L 進(jìn)行代碼格式化
如果導(dǎo)包出現(xiàn)順序問題可以使用快捷鍵:Ctrl+Alt+O 優(yōu)化導(dǎo)入的順序
總結(jié)
本文記錄在IntelliJ IDEA 中如何使用 Checkstyle對(duì)Java代碼規(guī)范檢查。
到此這篇關(guān)于IntelliJ IDEA中如何使用Checkstyle對(duì)Java代碼規(guī)范檢查的文章就介紹到這了,更多相關(guān)Checkstyle對(duì)Java代碼規(guī)范檢查內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
合并有序數(shù)組的實(shí)現(xiàn)(java與C語(yǔ)言)
這篇文章主要介紹了合并有序數(shù)組的實(shí)現(xiàn)(java與C語(yǔ)言)的相關(guān)資料,這里對(duì)有序數(shù)組的合并分享了java版本和C語(yǔ)言版本的示例,需要的朋友可以參考下2017-08-08
Mybatis/MybatisPlus公共字段填充與配置邏輯刪除
MyBatis 和 MyBatis-Plus 都提供了相應(yīng)的機(jī)制來(lái)處理這些公共字段的填充和邏輯刪除,下面就來(lái)介紹一下,感興趣的可以了解一下2025-05-05
Java?中的排序Comparable?與?Comparator?的使用與區(qū)別對(duì)比解析
本文給大家介紹Java中的排序Comparable與Comparator的使用與區(qū)別對(duì)比,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2025-09-09
idea設(shè)置回車換行縮進(jìn)空格數(shù)為4的實(shí)現(xiàn)方式
文章主要講述了解決在設(shè)置里回車換行僅縮進(jìn)兩空格的問題,通過將源代碼設(shè)置從回車兩空格改為回車四空格,解決了作者習(xí)慣上的不適2026-04-04
spring boot hutool整合email的詳細(xì)過程
這篇文章主要介紹了spring boot hutool整合email的相關(guān)知識(shí),本文介紹兩種方式發(fā)送email文件,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
使用Springboot打成jar包thymeleaf的問題
這篇文章主要介紹了使用Springboot打成jar包thymeleaf的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11
MyBatis-Plus工具使用之EntityWrapper解析
這篇文章主要介紹了MyBatis-Plus工具使用之EntityWrapper解析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Nacos服務(wù)實(shí)例的權(quán)重設(shè)置方式(以及設(shè)置為0時(shí)的作用與場(chǎng)景)
這篇文章主要介紹了Nacos服務(wù)實(shí)例的權(quán)重設(shè)置方式(以及設(shè)置為0時(shí)的作用與場(chǎng)景),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

