Google checkstyle实战

概述

CheckStyle检查代码是否符合制定的规范。CheckStyle检查是基于源码的,无需编译,执行速度快。

CheckStyle的主要流程是:

  1. 对Java文件进行词法语法分析,生成语法树。
  2. 载入配置文件(checkstyle-metadata.xml以及自定义的配置文件)register check事件。
  3. 按照深度优先遍历对语法树进行解析,按照注册的事件,在到达某些节点(AST)时进行style检查。AST,A child-Sibling Tree,是语法树中的某个节点,其类型在TokenTypes类中定义。
  4. 自定义Style的检查,就是在第二步设定的。实现com.puppycrawl.tools.checkstyle.api.Check类,重载其中的两个方法:public int[] getDefaultTokens()public void visitToken(DetailAST ast)。这两个方法的含义为,在遍历语法树的过程中,每当到达getDefaultTokens函数所返回的AST类型,程序就进入visitToken进行具体的检查和分析,即真正的分析检查过程是在visitToken中实现的。

CheckStyle有针对不同IDE和构建工具的各种插件,如 maven-checkstyle-plugin 插件,配置很简单:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-checkstyle-plugin</artifactId>
    <version>3.3.1</version>
    <configuration>
    	<!--内置4种规范:config/sun_checks.xml、config/maven_checks.xml、config/turbine_checks.xml、config/avalon_checks.xml、其中sun_checks.xml为默认值。修改默认配置-->
    	<configLocation>google_checkstyle.xml</configLocation>
    </configuration>
    <executions>
        <execution>
            <id>checkstyle</id>
            <phase>validate</phase>
            <goals>
                <goal>check</goal>
            </goals>
            <configuration>
                <failOnViolation>true</failOnViolation>
            </configuration>
        </execution>
    </executions>
</plugin>

定义在maven lifecycle的validate阶段执行check task,并且如果发现有违反标准的情况就会fail当前的build。运行checkstyle检查:mvn checkstyle:checkstyle

跳过对指定文件的某些检查

  • suppression:忽略指定文件的问题检查,不推荐;
  • 新增checkstyle-suppressions.xml文件suppressions配置项:
<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
        "-//Puppy Crawl//DTD Suppressions 1.0//EN"
        "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
<suppressions>
    <suppress checks="LineLengthCheck"
              files="SessionMessageSource.java"/>
</suppressions>

<suppressionsLocation>${basedir}/src/config/checkstyle-suppressions.xml</suppressionsLocation>
然后在配置文件里面可以定义一系列可用的模块,每一个模块提供严格程度(强制的,可选的…)可配置的检查规则。规则可以触发通知(notification),警告(warning)和错误(error)。
附:google-checkstyle

特点:

  1. 它可以有效的帮助我们检视代码以便更好的遵循代码编写标准,特别适用于小组开发时彼此间的样式规范和统一。
  2. Checkstyle提供高可配置性,以便适用于各种代码规范,所以除了使用它提供的几种常见标准之外,你也可以定制自己的标准。
  3. Checkstyle提供支持大多数常见IDE的插件,大部分插件中就含有最新的Checkstyle。
  4. Checkstyle可以检查代码的很多方面,从传统观点看,它主要是用来检查代码层面的,自从第三版以后,它的内部架构作了重大改变,很多其它意图的检测加了进来,现在Checkstyle可以检查像类设计的问题,重复代码,如锁的双重检查的bug模式。

报错

Token “METHOD_REF” was not found in Acceptable tokens list in check SeparatorWrapCheck

在IDEA的Terminal执行mvn clean compile报错:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle) on project test: Failed during checkstyle configuration: cannot initialize module TreeWalker - Token "METHOD_REF" was not found in Acceptable tokens list in check com.puppycrawl.tools.checkstyle.checks.whitespace.SeparatorWrapCheck.

参考stackoverflow问答java-google-checkstyle-maven:

You are trying to use a newer configuration with an old version of Checkstyle.

上面的报错信息提示,使用的Maven插件版本为3.0.0,升级到当前最新版3.3.1解决问题。

TreeWalker is not allowed as a parent of LineLength Please review ‘Parent Module’ section for this Check in web documentation if Check is standard.

继续执行mvn clean compile报错:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.3.1:check (checkstyle) on project test: Failed during checkstyle configuration: cannot initialize module TreeWalker - TreeWalker is not allowed as a parent of LineLength Please review 'Parent Module' section for this Check in web documentation if Check is standard.

参考GitHub issue,LineLength本来在TreeWalker module下面,提升到与TreeWalker同级的module,解决问题。
在这里插入图片描述
虽然解决问题,但是这样下去感觉问题会无穷无尽。

升级配置文件

考虑到上面升级过maven插件,即maven-checkstyle-plugin到最新版,那配置文件是不是也得一起升级下?打开托管在GitHub的官方配置文件google_checks,借助于diffchecker这类在线文本对比工具,好家伙。本地配置文件和GitHub里的配置文件相差也太大了吧。是该更新一下了!!

至于为何不直接使用存放在GitHub上的配置文件?这样的话,可以保证一直使用最新的配置文件。而要使用一个下载到本地的必定会过期的备份配置文件?主要是两点考量:

  1. The Wall的存在,访问GitHub速度不是很快很稳定;
  2. 一份可用的配置文件可以保证团队成员使用尽可能相同的编码规范。

Token “LITERAL_SWITCH” was not found in Acceptable tokens list in check RightCurlyCheck.

继续执行mvn clean compile依旧报错:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.3.1:check (checkstyle) on project test: Failed during checkstyle configuration: cannot initialize module TreeWalker - Token "LITERAL_SWITCH" was not found in Acceptable tokens list in check com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck.

不会吧。插件和配置文件都是最新的,配置文件是官方提供的,没有任何修改。

搜索google_checkstyle.xml文件,可以找到LITERAL_SWITCH及RightCurly。分析此最新版配置文件,不难得出结论:

  • checkstyle有若干个module组成,表示各个不同检查环节
  • LineLength不再是TreeWalker module下的子module,而是和TreeWalker同级,这也正好印证上面一个问题
  • TreeWalker下有若干个module,一个module对应一个方法,如com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck
  • 那token是什么呢?进阶章节会继续研究

回到问题本身。分析报错,大意是在RightCurly这个module里有个tokens属性字段里不能出现LITERAL_SWITCH?

抱着试一试的想法,修改官方提供的配置文件,删除RightCurly module下LITERAL_SWITCH这个token。

再次执行mvn clean compile,上面这个报错消失。出现新的报错,不过其形式和上面的报错一模一样。那就依样画瓢,找到报错的module和token,删除。最后执行mvn clean compile成功。

进阶

源码分析

上面留下一个疑问:token是什么?

看到完整包路径com.puppycrawl.tools.checkstyle.checks.blocks.RightCurlyCheck,不难找到maven依赖:

<dependency>
    <groupId>com.puppycrawl.tools</groupId>
    <artifactId>checkstyle</artifactId>
    <version>10.13.0</version>
</dependency>

包结构如下:
在这里插入图片描述
配置文件google_checkstyle.xml里的module对应的**Check类全部位于com.puppycrawl.tools.checkstyle.checks包下面。并且Check也模块化,有一下几种类型:
在这里插入图片描述
与此同时,在目录com.puppycrawl.tools.checkstyle.meta.blocks.blocks下面有一个xml文件RightCurlyCheck.xml,和Check方法一一对应。配置文件里的module对应一个继承AbstractCheck的Check方法,对应一个**Check.xml配置文件。

NoLineWrapCheck.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<checkstyle-metadata>
   <module>
      <check fully-qualified-name="com.puppycrawl.tools.checkstyle.checks.whitespace.NoLineWrapCheck"
             name="NoLineWrap"
             parent="com.puppycrawl.tools.checkstyle.TreeWalker">
         <description>Checks that chosen statements are not line-wrapped. By default, this Check restricts wrapping import and package statements, but it's possible to check any statement.</description>
         <properties>
            <property default-value="PACKAGE_DEF,IMPORT,STATIC_IMPORT"
                      name="tokens"
                      type="java.lang.String[]"
                      validation-type="tokenSet">
               <description>tokens to check</description>
            </property>
         </properties>
         <message-keys>
            <message-key key="no.line.wrap"/>
         </message-keys>
      </check>
   </module>
</checkstyle-metadata>

check下的name和配置文件google_checkstyle.xml的module name正好对应,parent指向TreeWalker,fully-qualified-name指向Java类文件。properties定义检查的token。

token是什么,回到文章开头,提到AST语法树及TokenTypes类。

借助于IDEA Double Shift快捷键以及左侧的项目视图,不难快速找到com.puppycrawl.tools.checkstyle.api.TokenTypes类文件,定义194个静态常量。以及tokentypes.properties配置文件,里面正好也是194行。经过对比,是一一对应的。

tokentypes.properties文件样例:

OBJBLOCK=An object block.

message-keys

参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/417137.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】认识类和对象

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、什么是面向对象&#xff1f;二、类的引入三、类的定义四、类的访问限定符与…

(C语言)Sleep函数,system函数,数组练习,详解与运用

一维数组详解&#xff1a;http://t.csdnimg.cn/zahZF 二维数组详解&#xff1a;http://t.csdnimg.cn/h2mLe 我们看过可一维数组与二维数组&#xff0c;现在我们来进行简单的练习。 题目&#xff1a;编写代码&#xff0c;演⽰多个字符从两端移动&#xff0c;向中间汇聚 1. …

AI大模型 拍照搜题

最近&#xff0c;发现一款小程序【问智通】&#xff0c;实现了拍照搜题结合AI大模型&#xff0c;省去了打字和敲数学公式向AI提问&#xff0c;完美的补充了其它拍照搜题平台拍不到&#xff0c;没解析等不足&#xff01;&#xff01;&#xff01; 小程序码&#xff1a; APP下载…

Python:运算符、内置函数和序列基本用法

一、学习目标 1&#xff0e;熟练使用Python运算符。 2&#xff0e;熟练使用Python内置函数。 3&#xff0e;掌握输入、输出函数的使用方法。 4&#xff0e;了解列表、元组、字典、集合的概念和基本用法。 二、相关练习 1&#xff0e;输入一个自然数250&#xff0c;输出其…

如何识别代理服务器的IP地址?

识别一个IP地址是否是由代理服务器发出的&#xff0c;是一项具有挑战性的任务。代理服务器是一种中间网络设备&#xff0c;用于转发客户端的请求和响应&#xff0c;从而隐藏原始客户端的IP地址。由于代理服务器的广泛使用&#xff0c;识别它们对于网络安全、数据分析和市场调研…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…

爬取一人之下所有图片网址以及图片的源代码

将网址保存到join中&#xff0c;图片源代码保存到本地目录中 import requests from lxml import etree import json import os from urllib import request# 设置Bing搜索URL和请求头 url https://cn.bing.com/images/search?q%E4%B8%80%E4%BA%BA%E4%B9%8B%E4%B8%8B%E5%9B%B…

BUUCTF AWD-Test1

打开靶场是这个有些简陋的界面。 随便点点&#xff0c;找到这个东西。 看到ThinkPHP&#xff0c;思路瞬间清晰&#xff0c;老熟人了。这个就是ThinkPHP漏洞。根据版本我们去找一下poc。 /index.php/?sIndex/\think\View/display&content%22%3C?%3E%3C?php%20phpinfo();…

通过多进程并发方式(fork)实现服务器

以下内容为视频学习记录。 1、父进程accept后返回的文件描述符为cfd以及用于创建连接的lfd; 调用fork()创建子进程后&#xff0c;子进程继承cfd,lfd&#xff0c;通过该cfd与连接过来的客户端通信,lfd对子进程来说没用&#xff0c;可以直接close(lfd); 对于父进程来说&#x…

Presto简介、部署、原理和使用介绍

Presto简介、部署、原理和使用介绍 1. Presto简介 1-1. Presto概念 ​ Presto是由Facebook开发的一款开源的分布式SQL查询引擎&#xff0c;最初于2012年发布&#xff0c;并在2013年成为Apache项目的一部分&#xff1b;Presto 作为现在在企业中流行使用的即席查询框架&#x…

用flymsg代替飞鸽传书(ipmsg、IPMessenger、聊天、文件传输)

用flymsg代替飞鸽传书(ipmsg、IPMessenger、聊天、文件传输) 一&#xff0e;简介 flymsg是由国人所开发的免费软件&#xff0c;是一款局域网内即时通信软件&#xff0c;基于TCP/IP&#xff08;UDP&#xff09;,可运行于多种操作平台&#xff08;Win,Mac,UNIX,Java&#xff09…

统计业务流量的毫秒级峰值 - 华为机试真题题解

考试平台&#xff1a; 时习知 分值&#xff1a; 200分&#xff08;第二题&#xff09; 考试时间&#xff1a; 两小时&#xff08;共3题&#xff09; 题目描述 业务模块往外发送报文时&#xff0c;有时会出现网卡队列满而丢包问题&#xff0c;但从常规的秒级流量统计结果看&…

MyBatis 学习(一)之 MyBatis 概述

目录 1 MyBatis 介绍 2 MyBatis 的重要组件 3 MyBatis 执行流程 4 参考文档 1 MyBatis 介绍 MyBatis 是一个半自动化的 ORM &#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;持久层框架&#xff0c;它允许开发者通过 XML 或注解将对象与数据库中…

【python】Python Turtle绘制流星雨动画效果(附源码)

在这篇技术博客中&#xff0c;我们将学习如何使用 Python 的 Turtle 模块绘制一个流星雨的动画效果。通过简单的代码实现&#xff0c;我们可以在画布上展现出流星闪耀的场景&#xff0c;为视觉带来一丝神秘与美感。 一、效果图&#xff1a; 二、准备工作 &#xff08;1)、导入…

生产报工异常信息提示器如何精确提醒管理人员

在现代生产环境中&#xff0c;生产报工异常信息的及时提醒对于管理人员来说至关重要。为了精确提醒管理人员并确保生产流程的顺利进行&#xff0c;智能信息接收腕表作为一种先进的工具&#xff0c;结合了多项功能&#xff0c;可以有效地实现生产报工异常信息的精确提醒。以下将…

【vmware安装群晖】

vmware安装群晖 vmware安装群辉&#xff1a; vmware版本&#xff1a;17pro 下载链接&#xff0c; https://customerconnect.vmware.com/cn/downloads/details?downloadGroupWKST-1751-WIN&productId1376&rPId116859 激活码可自行搜索 教程&#xff1a; https://b…

RK3568 Android12 适配抖音 各大APP

RK3568 Android12 适配抖音 各大APP SOC RK3568 system:Android 12 平台要适配抖音和各大APP 平台首先打开抖音发现摄像头预览尺寸不对只存在右上角,我将抖音APP装在手机上预览,发现是全屏 一开始浏览各大博客 给出的解决方法是修改framework 设置为全屏显示: framewo…

day09_面向对象_构造方法_封装

今日内容 零、 复习昨日 一、构造方法 二、重载 三、封装 零、 复习昨日 1 类和对象是什么关系? 类是模板(原材料)对象是具体实例(成品)类创建出对象 2 类中有什么?(类的成员) 成员属性(成员变量), 成员方法 3 创建对象的语法? 类名 对象名 new 类名(); 4 调用对象属性,方法…

Spade CNN技术细节

Input: (1,3,256,64,128) 做downsample 成 : (1,3,8,16,32) 首先有一个 EqualConv3D(3,128,3,3,stride1,padding1) 对 input 进行卷积得到&#xff1a; (1,128,8,16,32) input channel: 3 output channel: 128 EqualConv3D 就是一个普通的3D CNN&#xff0c; 只是 用到了 equ…

如何使用Docker部署IT-Tools并结合内网穿透实现公网访问本地工具箱服务

作为程序员&#xff0c;在日常工作中&#xff0c;需要借助一些工具来提高我们工作效率&#xff0c;IT-Tools是为开发人员度身打造的一套便捷在线工具。它提供全面功能&#xff0c;使开发者能以更高效方式完成任务。经由IT-Tools&#xff0c;开发人员能轻松应对各类技术挑战&…