官方文档地址:https://checkstyle.sourceforge.io/
下载地址:https://github.com/checkstyle/checkstyle/releases/
或使用maven引入:
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>10.12.7</version>
</dependency>
"D:\java17\bin\java.exe" -cp "D:\tool_configs\checkstyle-10.12.7-all.jar" com.puppycrawl.tools.checkstyle.gui.Main
运行界面如下:
界面如下
COMPILATION_UNIT 1 0 COMPILATION_UNIT
PACKAGE_DEF 1 0 package
IMPORT 3 0 import
IMPORT 4 0 import
IMPORT 5 0 import
IMPORT 6 0 import
IMPORT 7 0 import
IMPORT 8 0 import
IMPORT 9 0 import
IMPORT 10 0 import
IMPORT 11 0 import
IMPORT 12 0 import
IMPORT 13 0 import
IMPORT 14 0 import
IMPORT 15 0 import
IMPORT 16 0 import
IMPORT 17 0 import
IMPORT 18 0 import
IMPORT 19 0 import
IMPORT 20 0 import
IMPORT 21 0 import
IMPORT 22 0 import
IMPORT 23 0 import
IMPORT 24 0 import
IMPORT 25 0 import
IMPORT 26 0 import
IMPORT 27 0 import
IMPORT 28 0 import
IMPORT 29 0 import
IMPORT 30 0 import
IMPORT 31 0 import
IMPORT 33 0 import
IMPORT 34 0 import
IMPORT 35 0 import
IMPORT 36 0 import
IMPORT 37 0 import
IMPORT 38 0 import
CLASS_DEF 40 0 CLASS_DEF
MODIFIERS 40 0 MODIFIERS
LITERAL_PUBLIC 40 0 public
LITERAL_CLASS 40 7 class
IDENT 40 13 AIApp
EXTENDS_CLAUSE 40 19 extends
IDENT 40 27 Application
OBJBLOCK 40 39 OBJBLOCK
LCURLY 40 39 {
METHOD_DEF 42 4 METHOD_DEF
MODIFIERS 42 4 MODIFIERS
TYPE 42 11 TYPE
IDENT 42 16 checkCodeMenu
LPAREN 42 29 (
PARAMETERS 42 30 PARAMETERS
RPAREN 42 53 )
SLIST 42 54 {
METHOD_DEF 51 4 METHOD_DEF
METHOD_DEF 61 4 METHOD_DEF
METHOD_DEF 84 4 METHOD_DEF
METHOD_DEF 177 4 METHOD_DEF
METHOD_DEF 231 4 METHOD_DEF
METHOD_DEF 261 4 METHOD_DEF
METHOD_DEF 297 4 METHOD_DEF
METHOD_DEF 325 4 METHOD_DEF
METHOD_DEF 365 4 METHOD_DEF
METHOD_DEF 441 4 METHOD_DEF
RCURLY 445 0 }
这是 Checkstyle GUI 解析的 Java 源文件的抽象语法树(AST)的部分内容。AST 是对代码结构的一种树形表示,它将源代码的结构以一种易于分析和处理的方式呈现。
以下是每个条目的解释:
package
语句。import
语句。public
。public
关键字。class
关键字。extends
关键字。{
。(
。)
。}
。这些条目组合在一起构成了 Java 源文件的结构。Checkstyle 使用 AST 来遍历和检查源代码,确保代码符合定义的规范。在这个例子中,可能是一个包含类定义和多个方法的 Java 文件。
Checkstyle 的 XPath Query 功能允许用户定义自定义规则并在代码中使用 XPath 表达式进行检查。这个功能允许开发者基于代码结构的 XPath 查询来定义检查规则,XPath 表达式用于定位和匹配源代码中的特定结构。以下是 Checkstyle XPath Query 的基本用法和示例
XPath Query 的基本语法为
//XPath_Expression
其中,//
表示查找匹配的任意位置,XPath_Expression
是 XPath 表达式。
查找所有类定义xpath //CLASS_DEF
查找所有包含 System.out.println
的语句xpath //EXPR[matches(@text, 'System\.out\.println')]
XPath 还支持使用元素的属性进行匹配。例如,可以使用 @token
属性匹配指定类型的元素。
//LITERAL[@token='abstract']
可以使用逻辑运算符 and
、or
和 not
来组合多个查询条件。
//CLASS_DEF[MODIFIERS/LITERAL_PUBLIC and not(MODIFIERS/LITERAL_STATIC)]
XPath 查询功能需要在 Checkstyle 配置文件中启用。在配置文件中,使用 <module name="XPathCheck"/>
启用 XPath 检查器。xml <module name="XPathCheck"/>
XPath 表达式通常基于 XML 结构,但在 Checkstyle 中,它用于匹配 AST(抽象语法树)中的代码结构。因此,XPath 表达式的使用方式可能与常规 XML 文档中的 XPath 表达式有所不同。Checkstyle 的 XPath Query 功能是强大的,但也需要一定的 XPath 知识。详细的 XPath 表达式语法和使用方法可以参考 XPath 的相关文档。
让我们逐步解析这个表达式
/COMPILATION_UNIT/CLASS_DEF[./IDENT[@text='AIApp']]/OBJBLOCK/METHOD_DEF[./IDENT[@text='checkCodeMenu']]
/COMPILATION_UNIT
从根节点开始,查找名为 COMPILATION_UNIT
的元素。
/CLASS_DEF[./IDENT[@text='AIApp']]
在找到的 COMPILATION_UNIT
中,查找名为 CLASS_DEF
的子元素,并确保其中有一个子元素的名字为 IDENT
且其文本内容为 'AIApp'
。
/OBJBLOCK
在满足上述条件的 CLASS_DEF
中,查找名为 OBJBLOCK
的子元素。
/METHOD_DEF[./IDENT[@text='checkCodeMenu']]
在 OBJBLOCK
中,查找名为 METHOD_DEF
的子元素,并确保其中有一个子元素的名字为 IDENT
且其文本内容为 'checkCodeMenu'
。这个 XPath Query 的整体作用是定位一个 Java 源代码文件中,包含一个类定义(CLASS_DEF)的 COMPILATION_UNIT,这个类的名字是 'AIApp',在这个类的 OBJBLOCK 中包含一个名为 'checkCodeMenu' 的方法(METHOD_DEF)。这种 XPath Query 可以用于 Checkstyle 中,作为自定义规则的一部分,用于检查代码中是否包含特定类和方法的定义,以确保符合团队的编码规范。
基于上面的步骤,我们就可以去定位代码了。
可以配置来检查和强制执行不同的编码规范和最佳实践。我们先来看看如何在IDEA中使用CheckStyle
在idea的插件商店中安装下载CheckStyle-IDEA
,如下图:
进入editor->Inspections->搜索Checkstyle 全部勾上
进入 Tools->Checkstyle
可以发现区域中包含了两部分的检测方案,分别是sun
公司和Google
的规范对应的配置。相关的介绍我们可以在官方文档中可以看到,地址分别是https://checkstyle.sourceforge.io/google_style.html
和 https://checkstyle.sourceforge.io/sun_style.html
。
在安装好了checkstyle之后,我们就可以在idea的界面看到相关的操作。
Alt text点击1
处按钮,进入checkstyle的操作,选择2
中的Google Checks,然后选择3
代表的是启动分析,将会分析4
对应的文件,最终将结果输出到窗口中。
下面是一个简单Checkstyle 对 Java 代码进行了 Google 风格的检查,并给出了一系列的警告和错误
Checkstyle found 36 item(s) in 1 file(s)
YamlUtils.java : 36 item(s)
Package name 'com.demo123567.desktop.auto_tools.utils' must match pattern '^[a-z]+(\.[a-z][a-z0-9]*)*$'. (1:9) [PackageName]
缺少摘要javadoc。(6:0) [SummaryJavadoc]
'method def modifier' 缩进了4个缩进符,应为2个。(12:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(13:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(14:5) [Indentation]
'method def modifier' 缩进了4个缩进符,应为2个。(16:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(17:9) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(18:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(19:5) [Indentation]
'method def modifier' 缩进了4个缩进符,应为2个。(21:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(22:9) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(23:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(24:5) [Indentation]
'method def modifier' 缩进了4个缩进符,应为2个。(26:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(27:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(28:5) [Indentation]
'method def modifier' 缩进了4个缩进符,应为2个。(30:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(31:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(32:5) [Indentation]
Javadoc的第一句缺少一个结束时期。(34:0) [SummaryJavadoc]
@标签应有非空说明。(37:0) [NonEmptyAtclauseDescription]
@标签应有非空说明。(38:0) [NonEmptyAtclauseDescription]
'method def modifier' 缩进了4个缩进符,应为2个。(40:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(41:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(42:5) [Indentation]
'method def modifier' 缩进了4个缩进符,应为2个。(44:5) [Indentation]
'method def' 子元素缩进了8个缩进符,应为4个。(45:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(46:5) [Indentation]
'method def modifier' 缩进了4个缩进符,应为2个。(48:5) [Indentation]
WhitespaceAround: '{' is not preceded with whitespace. (48:66) [WhitespaceAround]
'method def' 子元素缩进了8个缩进符,应为4个。(49:9) [Indentation]
',' 后应有空格。(49:61) [WhitespaceAfter]
'method def' 子元素缩进了8个缩进符,应为4个。(50:9) [Indentation]
'method def rcurly' 缩进了4个缩进符,应为2个。(51:5) [Indentation]
本行字符数 1,495个,最多:100个。(57:0) [LineLength]
注释应与第48行代码同样缩进4个缩进符,而不是0个。(65:1) [CommentsIndentation]
以下是对每个问题的简要解释:
@
标签应该有非空说明。{
前面没有空格。这些问题主要涉及到代码格式、缩进、Javadoc 注释等方面的规范。我们可以根据这些提示逐一修复代码,以确保代码符合 Google 的编码规范。
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8