【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 国内免费云服务器ÿ…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
