【Java代码规范】阿里编码规约 VS CheckStyle
全文速览:
- 1、关于代码编码质量
- 2、如何小成本有效管理企业内的编码规范
- 2.1 阿里编码规约IDE插件
- 2.2 CheckStyle IDE插件
- 3、如何在代码提交中检验规范
- 3.1 阿里编码规约配置git precommit check
- 3.2 CheckStyle配置git precommit check
- 3.3 实践
1、关于代码编码质量
关于企业内部如何管控代码规范、保证应用服务质量是一个基础性的问题,只要是有技术性要求的项目,都应该遵守一套既定的保障应用代码质量的规范。
常规的小成本而有见效的方式就是使用编辑器或者代码规范检测的方式,控制代码的提交。提交的代码再依赖组件,做人工的code review来把关。
常见的规范扫描工具:阿里编码规约扫描、checkStyle。
今天主要描述这两个工具如何在日常编码过程中使用,以及如何与git配合来规范代码的提交。
2、如何小成本有效管理企业内的编码规范
2.1 阿里编码规约IDE插件
阿里编码规约扫描是一个成熟的组件,我这边使用的是IDEA:
- 可以直接在插件市场中进行下载:Alibaba Java Coding Guidelines
- 如果步骤一存在困难的,可以前往github下载源码进行打包(https://github.com/alibaba/p3c),最终打包成包含依赖的jar包,我这边构建了一个p3c-pmd-2.1.1-jar-with-dependencies.jar,打包后在IDEA中从本地地址导入插件
以上两种方式已经可以成功安装插件,只需要【Restart IDE】就可以生效。
重启后,在某一个类文件中右击或者在顶部菜单栏【Tools -> 阿里编码规约】下就可以发现它,点击即可触发扫描。
如果IDE性能有限,建议关闭实时检测。
2.2 CheckStyle IDE插件
- 与阿里编码规约类似,也是在插件市场中直接下载,重启IDE后生效
- 如果步骤一存在困难,可以下载官方打包的release版本,然后导入 --> https://github.com/checkstyle/checkstyle/releases?page=1。
注意checkStyle与JAVA版本的对应关系,否则启动检测你将发现提示has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
。
JRE And JDK:Runtime of Checkstyle is limited only by minimal version or JRE.
Checkstyle version | JRE version |
---|---|
10.x | 11 and above |
7.x, 8.x, 9.x | 8 and above |
6.x | 6 and above |
5.x | 5 and above |
官方文档链接:https://checkstyle.sourceforge.io/
3、如何在代码提交中检验规范
通用流程是一致的,两者就是在指令以及输出内容上有所差异,一般pre-commit的配置如下:
- 在项目根目录 .git/hooks 下 找到 pre-commit.example文件,简单查阅,文档内也是会给到一定的提示。
cp pre-commit.example pre-commit
生成正式生效的文件 pre-commit- 下面主要是在这个内部书写检测逻辑,大体的一般是:
a. 从git的提交数据中获取到修改的文件或目录,遍历文件或目录;
b. 针对每一项执行检查,具体规范具体指定,检查出修改项;
c. exitcode返回非0,不会提交代码。exitcode为0表示通过,会提交代码;
以下主要展示两者的demo
3.1 阿里编码规约配置git precommit check
指令: java -cp ./p3c-pmd-2.1.1-jar-with-dependencies.jar net.sourceforge.pmd.PMD -d ./Task.java -R rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-orm.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml -f text
- -cp 指定使用的JAR包以及启动类
- -d 指定需要检测的文件或目录,多个文件使用逗号相连
- -R 指定检测所需的配置文件,这些配置文件是alibaba-pmp-p3c项目下默认自带的,也可以根据语法自定义
- -f 指定输出的格式类型,支持的输出形式有很多
Available report formats and their configuration properties are:codeclimate: Code Climate integration.csv: Comma-separated values tabular format.problem - Include Problem column default: truepackage - Include Package column default: truefile - Include File column default: truepriority - Include Priority column default: trueline - Include Line column default: truedesc - Include Description column default: trueruleSet - Include Rule set column default: truerule - Include Rule column default: trueemacs: GNU Emacs integration.empty: Empty, nothing.html: HTML formatlinePrefix - Prefix for line number anchor in the source file.linkPrefix - Path to HTML source.ideaj: IntelliJ IDEA integration.classAndMethodName - Class and Method name, pass '.method' when processing a directory. default: sourcePath - Source path. default: fileName - File name. default: summaryhtml: Summary HTML format.linePrefix - Prefix for line number anchor in the source file.linkPrefix - Path to HTML source.text: Text format.textcolor: Text format, with color support (requires ANSI console support, e.g. xterm, rxvt, etc.).color - Enables colors with anything other than 'false' or '0'. default: yestextpad: TextPad integration.vbhtml: Vladimir Bossicard HTML format.xml: XML format.encoding - XML encoding format, defaults to UTF-8. default: UTF-8xslt: XML with a XSL Transformation applied.encoding - XML encoding format, defaults to UTF-8. default: UTF-8xsltFilename - The XSLT file name.yahtml: Yet Another HTML format.outputDir - Output directory.
样例:
#!/bin/sh
# claire# From java package
# alicheck version: 2.2.1
# jdk version: 1.8function print(){
echo "aliCheck>> $*"
}print "Javacode stylecheck starting, please wait..."
wd=`pwd`
print "Workdir: $wd"check_jar_path="$wd/.git/jars/p3c-pmd-2.1.1-jar-with-dependencies.jar"
check_xml_path="rulesets/java/ali-comment.xml,rulesets/java/ali-concurrent.xml,rulesets/java/ali-constant.xml,rulesets/java/ali-exception.xml,rulesets/java/ali-flowcontrol.xml,rulesets/java/ali-naming.xml,rulesets/java/ali-oop.xml,rulesets/java/ali-orm.xml,rulesets/java/ali-other.xml,rulesets/java/ali-set.xml"
check_result_file="$wd/temp"# 清空temp文件
rm -rf $check_result_fileis_err=0
is_warn=0path=''
for file in `git status --porcelain | sed s/^...// | grep '\.java$' | grep -v 'test'`;
do
path+="$wd/$file "
done
if [ "x${path}" != "x" ];thenprint "Check file: $path"re=`java -cp $check_jar_path net.sourceforge.pmd.PMD -d $path -R $check_xml_path -f text >> $check_result_file`err=`cat temp | grep "va:"`err_count=`cat temp | grep "va:" | wc -l`if [[ $err = *"va:"* ]];thenprint "detect error lines count: ${err_count}"print "${err}"is_err=1fi
fi
print "Javacode stylecheck finished. Thank you for your commit!"rm -rf $check_result_fileif [ $is_err -ne 0 ] || [ $is_warn -ne 0 ]
then
print "Please return and fix stylecheck warnings before code commit!"
exit 1
fiexit 0
3.2 CheckStyle配置git precommit check
指令:java -jar ./checkstyle-8.45-all.jar -c ./checkStyle.xml /Task.java -f text -o outputTempFile
- -jar 指定checkstyle jar包位置
- -c 指定检查的配置文件 后面紧跟要检查的文件或目录
- -f 指定输出的格式类型 有XML, SARIF, PLAIN
- -o 指定输出检查结果的位置,默认不指定是输出到终端
样例:
#!/bin/sh
# claire# From java package
# checkStyle version: 8.45
# jdk version: 1.8function print(){
echo "checkStyle>> $*"
}print "Javacode stylecheck starting, please wait..."
wd=`pwd`
print "Workdir: $wd"check_jar_path="$wd/.git/jars/checkstyle-8.45-all.jar"
check_xml_path="$wd/.git/files/checkStyle.xml"
check_result_file="$wd/temp"# 清空temp文件
rm -rf $check_result_fileis_err=0
is_warn=0path=''
for file in `git status --porcelain | sed s/^...// | grep '\.java$' | grep -v 'test'`;
do
path+="$wd/$file "
done
if [ "x${path}" != "x" ];thenprint "Check file: $path"re=`java -jar $check_jar_path -c $check_xml_path $path -f plain -o $check_result_file`err=`cat temp | grep "ERROR"`err_count=`cat temp | grep "ERROR" | wc -l`warn=`cat temp | grep "WARN"`warn_count=`cat temp | grep "WARN" | wc -l`info=`cat temp`if [[ $err = *"ERROR"* ]];thenprint "detect error lines count: ${err_count}"print "${err}"is_err=1fiif [[ $warn = *"WARN"* ]];thenprint "detect warning lines count: ${warn_count}"print "${warn}"is_warn=1fi
fi
print "Javacode stylecheck finished. Thank you for your commit!"rm -rf $check_result_fileif [ $is_err -ne 0 ] || [ $is_warn -ne 0 ]
then
print "Please return and fix stylecheck warnings before code commit!"
exit 1
fiexit 0
3.3 实践
以上任意一款git pre commit 配置完成后
- git add .
- git commit -m “test”
提交后就会开启代码检测,如果存在拦截的逻辑,就无法继续commit
aliCheck:
git commit -m "test1"
aliCheck>> Javacode stylecheck starting, please wait...
aliCheck>> Workdir: xxxx
aliCheck>> Check file: xxxx/Task.java
aliCheck>> detect error lines count: 4
aliCheck>> xxx/Task.java:64: 方法名【UUUSE2345789】不符合lowerCamelCase命名风格
aliCheck>> Javacode stylecheck finished. Thank you for your commit!
aliCheck>> Please return and fix stylecheck warnings before code commit!
checkStyle:
git commit -m "test2"
checkStyle>> Javacode stylecheck starting, please wait...
checkStyle>> Workdir: XXX
checkStyle>> Check file: xxx/Task.java
Checkstyle ends with 28 errors.
checkStyle>> detect error lines count: 28
checkStyle>> [ERROR] xxx/Task.java:3: Not allow chinese character ! [RegexpSingleline]
......
[ERROR] xxx/Task.java:71:29: '+' is not preceded with whitespace. [WhitespaceAround]
checkStyle>> Javacode stylecheck finished. Thank you for your commit!
checkStyle>> Please return and fix stylecheck warnings before code commit!
相关文章:
【Java代码规范】阿里编码规约 VS CheckStyle
全文速览: 1、关于代码编码质量2、如何小成本有效管理企业内的编码规范 2.1 阿里编码规约IDE插件2.2 CheckStyle IDE插件 3、如何在代码提交中检验规范 3.1 阿里编码规约配置git precommit check3.2 CheckStyle配置git precommit check3.3 实践 1、关于代码编码质…...

iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标?
iPhone苹果15手机圆点怎么设置让屏幕上显示出来圆形图标? 1、在iPhone苹果手机上找到「设置」并点击打开; 2、在苹果iPhone设置内找到「辅助功能」并点击打开; 3、在苹果iPhone手机辅助功能内的动作交互内找到「触控」并点击打开;…...

kibana报错内存溢出问题解决
一、背景: kibana内存溢出,进程被kill掉,导致前端页面访问不到。 报错内容 二、报错原因: 发现是前端 js 报的内存 oom 异常,通过网上资料发现node.js 的默认内存大小为1.4G Node 中通过 JavaScript 使用内存时只能…...
【C语法】1124循环结构
#include <stdio.h> int main(){ //输入一个数。倒叙输出各个位上的数。 //123456 6 5 4 3 2 1 // 1输出个位上的数 %10 // 2将这个数去掉个位上的数。 / 10 // 3当这个数最后变成0时结束 int a 0; printf("请输入一个正整数:"); scanf…...

在PHP8中向数组添加元素-PHP8知识详解
在php8中向数组添加元素有多种方法,在这里主要讲解几个常用的方法:使用方括号[]添加元素、使用array_unshift()函数,向数组的头部添加元素、使用array_push()函数,向数组的尾部添加元素、使用array_splice()函数添加元素。 1、使用…...

Drupal __ 8.5.0 __ XSS文件上传 __CVE-2019-6341
Drupal __ 8.5.0 __ XSS文件上传 __CVE-2019-6341 说明内容漏洞编号CVE-2019-6341漏洞名称Drupal XSS漏洞漏洞评级中危影响范围在7.65之前的Drupal 7版本中; 8.6.13之前的Drupal 8.6版本; 8.5.14之前的Drupal 8.5版本。漏洞描述Drupal诞生于2000年,是一…...

Pycharm中配置Celery启动
Pycharm中配置Celery启动 前置条件 目录结构 ----FerDemo --------celery_demo ------------tasks.py tasks.py文件代码 import sys import time from celery import Celeryapp Celery(demo,backendredis://:password127.0.0.1/0,brokerredis://:password127.0.0.1/1,broker…...

Jmeter —— 常用的几种断言方法(基本用法)
在使用JMeter进行性能测试或者接口自动化测试工作中,经常会用到的一个功能,就是断言,断言相当于检查点,它是用来判断系统返回的响应结果是否正确,以此帮我们判断测试是否通过,本文 主要介绍几种常用的断言&…...
mybatis bean属性识别丢失【NoSuchPropertyException】
背景 发现线上报错日志 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression Cause: org.apache.ibatis.ognl.NoSuchPropertyException: 参考 https://github.com/mybatis/mybatis-…...
点云从入门到精通技术详解100篇-基于补全点云与图像像素级融合的障碍物识别
目录 前言 感知融合技术研究现状及问题 感知融合技术概述 特征级融合研究现状...
商品分类显示scroll-view布局实现
快捷键 view{菜单数据$}*40 回车后即可快速生成 <view class="cates"> <!-- 搜索开始 --><SearchBar></SearchBar> <!-- 搜索结束 --> <view class="cates_container"> <!-- 左侧菜单 开始 --> <scroll-vie…...

基本的SELECT语句——“MySQL数据库”
各位CSDN的uu们好呀,好久没有更新小雅兰的MySQL数据库专栏啦,接下来一段时间,小雅兰都会更新MySQL数据库的知识,下面,让我们进入今天的主题吧——基本的SELECT语句!!! SQL概述 SQL语…...
DedeCMS5.7远程文件包含漏洞分析
看一段php代码 <?php foreach(Array(_GET,_POST,_COOKIE) as $_request){foreach($$_request as $_k > $_v) ${$_k} $_v; }echo a:.$a;echo b:.$b;这段代码可以实现创建变量并赋值的操作,而且参数都是可控的。 如果之前已经有了相应参数,那就会…...

GpsAndMap模块开源,欢迎测评
背景 之前的文章有提到,最近在使用folium的过程中,深感对于一个非专业人员来说,GPS坐标以及其所隐含的GPS坐标系,以及不同GPS坐标系之间的相互转换关系,不是一个十分清晰的概念,往往造成在使用GPS坐标在fo…...

DHT11 温湿度传感器
目录 1.DHT11 温湿度传感器概述 2.检测DHT11温湿度传感器模块是否存在 3.通过编写代码读取温湿度数据编辑 4.将读取到的温湿度数据通过串口上传 1.DHT11 温湿度传感器概述 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器,应用领域&am…...

vue3 自定义Hooks
文章目录 前言一、Hooks是什么?二、图片转换Base641.Hooks2.使用 三、监听元素宽高(自定义指令Hooks)1.Hooks2.使用 总结 前言 本文主要记录了vue3学习中自定义Hooks和vue2中Mixins的使用与案例。 一、Hooks是什么? Hooks用来处…...

计算机组成与设计硬件软件接口学习1
计算机的算术运算 子字并行 (大致浏览)pdf 170页左右 浮点加法不满足结合律: 适用于整型数据类型的并行执行策略并不适用于浮点数据类型 ,原因如上↑ 处理器 流水线 流水线是一种能使多条指令重叠执行的实现技术 流水线技术通…...
点云从入门到精通技术详解100篇-基于光谱共焦系统的三维点云数据处理
前言 随着信息技术的飞速发展,我们在生活中受到数字信息带来的方 便日趋增多,数字信息资源对我们的影响越来越深。例如手机上的通 信行程卡,详细记录着我们每个人的所处位置、健康信息等,对于大 量数据的处理成为每个人关注的焦点。近些年来出现的光谱共焦扫描 技术,配…...

2023年五一杯数学建模B题快递需求分析问题求解全过程论文及程序
2023年五一杯数学建模 B题 快递需求分析问题 原题再现: 网络购物作为一种重要的消费方式,带动着快递服务需求飞速增长,为我国经济发展做出了重要贡献。准确地预测快递运输需求数量对于快递公司布局仓库站点、节约存储成本、规划运输线路等具…...

华为云征文|华为云云耀云服务器L实例使用教学(一)
目录 国内免费云服务器(体验) 认识国内免费云服务器 如何开通国内免费云服务器 云耀云服务器 HECS HECS适用于哪些场景? 网站搭建 电商建设 开发测试环境 云端学习环境 为什么选择华为云耀云服务器 HECS 国内免费云服务器ÿ…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

Android写一个捕获全局异常的工具类
项目开发和实际运行过程中难免会遇到异常发生,系统提供了一个可以捕获全局异常的工具Uncaughtexceptionhandler,它是Thread的子类(就是package java.lang;里线程的Thread)。本文将利用它将设备信息、报错信息以及错误的发生时间都…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...