当前位置: 首页 > news >正文

【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:

  1. 可以直接在插件市场中进行下载:Alibaba Java Coding Guidelines
  2. 如果步骤一存在困难的,可以前往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插件

  1. 与阿里编码规约类似,也是在插件市场中直接下载,重启IDE后生效
  2. 如果步骤一存在困难,可以下载官方打包的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 versionJRE version
10.x11 and above
7.x, 8.x, 9.x8 and above
6.x6 and above
5.x5 and above

官方文档链接:https://checkstyle.sourceforge.io/

3、如何在代码提交中检验规范

通用流程是一致的,两者就是在指令以及输出内容上有所差异,一般pre-commit的配置如下:

  1. 在项目根目录 .git/hooks 下 找到 pre-commit.example文件,简单查阅,文档内也是会给到一定的提示。
  2. cp pre-commit.example pre-commit 生成正式生效的文件 pre-commit
  3. 下面主要是在这个内部书写检测逻辑,大体的一般是:
    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手机辅助功能内的动作交互内找到「触控」并点击打开&#xff1b…...

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("请输入一个正整数&#xff1a;"); scanf…...

在PHP8中向数组添加元素-PHP8知识详解

在php8中向数组添加元素有多种方法&#xff0c;在这里主要讲解几个常用的方法&#xff1a;使用方括号[]添加元素、使用array_unshift()函数&#xff0c;向数组的头部添加元素、使用array_push()函数&#xff0c;向数组的尾部添加元素、使用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版本中&#xff1b; 8.6.13之前的Drupal 8.6版本; 8.5.14之前的Drupal 8.5版本。漏洞描述Drupal诞生于2000年&#xff0c;是一…...

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进行性能测试或者接口自动化测试工作中&#xff0c;经常会用到的一个功能&#xff0c;就是断言&#xff0c;断言相当于检查点&#xff0c;它是用来判断系统返回的响应结果是否正确&#xff0c;以此帮我们判断测试是否通过&#xff0c;本文 主要介绍几种常用的断言&…...

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们好呀&#xff0c;好久没有更新小雅兰的MySQL数据库专栏啦&#xff0c;接下来一段时间&#xff0c;小雅兰都会更新MySQL数据库的知识&#xff0c;下面&#xff0c;让我们进入今天的主题吧——基本的SELECT语句&#xff01;&#xff01;&#xff01; 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;这段代码可以实现创建变量并赋值的操作&#xff0c;而且参数都是可控的。 如果之前已经有了相应参数&#xff0c;那就会…...

GpsAndMap模块开源,欢迎测评

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

DHT11 温湿度传感器

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

vue3 自定义Hooks

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

计算机组成与设计硬件软件接口学习1

计算机的算术运算 子字并行 &#xff08;大致浏览&#xff09;pdf 170页左右 浮点加法不满足结合律&#xff1a; 适用于整型数据类型的并行执行策略并不适用于浮点数据类型 &#xff0c;原因如上↑ 处理器 流水线 流水线是一种能使多条指令重叠执行的实现技术 流水线技术通…...

点云从入门到精通技术详解100篇-基于光谱共焦系统的三维点云数据处理

前言 随着信息技术的飞速发展,我们在生活中受到数字信息带来的方 便日趋增多,数字信息资源对我们的影响越来越深。例如手机上的通 信行程卡,详细记录着我们每个人的所处位置、健康信息等,对于大 量数据的处理成为每个人关注的焦点。近些年来出现的光谱共焦扫描 技术,配…...

2023年五一杯数学建模B题快递需求分析问题求解全过程论文及程序

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

华为云征文|华为云云耀云服务器L实例使用教学(一)

目录 国内免费云服务器&#xff08;体验&#xff09; 认识国内免费云服务器 如何开通国内免费云服务器 云耀云服务器 HECS HECS适用于哪些场景&#xff1f; 网站搭建 电商建设 开发测试环境 云端学习环境 为什么选择华为云耀云服务器 HECS 国内免费云服务器&#xff…...

编写算法对输入的一个整数,判断它能否被 3,5,7 整除

任务描述 本关任务&#xff0c;编写算法对输入的一个整数&#xff0c;判断它能否被 3&#xff0c;5&#xff0c;7 整除&#xff0c;并输出以下信息之一&#xff1a; 能同时被 3&#xff0c;5&#xff0c;7 整除&#xff1b; 能被其中两数&#xff08;要指出哪两个&#xff09…...

Linux CentOS7设置时区

在Linux系统中&#xff0c;默认使用的是UTC时间。 即使在安装系统的时候&#xff0c;选择的时区是亚洲上海&#xff0c;Linux默认的BIOS时间&#xff08;也称&#xff1a;硬件时间&#xff09;也是UTC时间。 在重启之后&#xff0c;系统时间会和硬件时间同步&#xff0c;如果…...

HBase 记录

HBase 管理命令 hbase hbck -details TABLE_NAME hbase hbck -repair TABLE_NAMEHBase概览 Master、RegionServer作用 RegionServer与Region关系 数据定位原理 https://blogs.apache.org/hbase/entry/hbase_who_needs_a_master RegionServer HBase Essentials.pdf (P25)…...

Fiddler抓http数据

目录 参考博客 一、Fiddler配置二、分析Http请求1. Http消息结构简介1.1 Request请求消息1.2 Response响应消息 2. 分析Get接口2.1 请求示例2.2 查看Get请求2.3 查看Get响应 3 分析Post接口 参考博客 一、Fiddler配置 首先需要对Fiddler抓取Https请求进行相关配置&#xff1a…...

【MySQL】redo log 、 undo log、脏页这些概念是什么?

redo log&#xff08;重做日志&#xff09;redo log 是什么redo log 的主要作用Redo 的组成redo如何保证 事务的持久性 undo log&#xff08;撤销日志/回滚日志&#xff09;undo log 是什么redo log 的主要作用undo的存储位置 如何区分 redo log和undo log感谢 &#x1f496;参…...

05ShardingSphere-JDBC水平分片

1、准备服务器 随着业务的扩大&#xff0c;订单表数据量不断增加&#xff0c;数据库面临存储压力&#xff0c;开始考虑对订单表进行水平分片。 将t_order表扩展为server-order0中的t_order0和t_order1、server-order1中的t_order0和t_order1 服务器规划&#xff1a;使用dock…...

Java多线程并发面试题

文章目录 Java并发基础并行和并发有什么区别&#xff1f;说说什么是进程和线程&#xff1f;Java线程创建方式&#xff1f;Runnable和Callable接口的区别&#xff1f;为什么调用start()方法时会执行run()方法&#xff0c;不直接调用run()方法&#xff1f;sleep()和wait()的区别&…...

ELK学习笔记1:简介及安装

ELK学习笔记1&#xff1a;简介及安装 ELK的简介 ELK是三个开源软件的缩写&#xff0c;分别表示&#xff1a;Elasticsearch , Logstash, Kibana , 它们都是开源软件。新增了一个FileBeat&#xff0c;它是一个轻量级的日志收集处理工具(Agent)&#xff0c;Filebeat占用资源少&a…...

uniapp——实现电子签名功能——基础积累

话说&#xff0c;2020年刚来杭州的时候&#xff0c;有用到过uniapp&#xff0c;距今已有三年时间了&#xff0c;果然全忘了&#xff0c;哈哈[笑中带泪] 昨天遇到一个需求&#xff1a;就是要实现pdf文件的预览&#xff0c;着实费了我很多的时间&#xff0c;连晚饭都没有吃好。。…...

【Flink实战系列】Hash collision on user-specified ID “Kafka Source”

Hash collision on user-specified ID “Kafka Source” 在使用 fromSource 构建 Kafka Source 的时候,遇到下面的报错,下面就走进源码,分析一下原因。 Exception in thread "main" java.lang.IllegalArgumentException: Hash collision on user-specified ID &…...

建站网站排行/百度关键词搜索排名多少钱

一、springboot整合redisson环境 请参考我的上一篇博客&#xff1a;springboot整合redisson&#xff08;一&#xff09;搭建Redisson环境。 二、什么是锁&#xff1f; 我们讲的锁一般指的是同步锁&#xff0c;同步锁是为了保证多线程的操作都能符合预期结果&#xff0c;不会…...

地方门户系统/南宁seo排名外包

在setup的帮助下&#xff0c;我们顺利地从16位实地址模式过渡到32位段式寻址的保护模式。又在arch/i386/boot/compressed/head.S的帮助下实现了内核的自解压&#xff0c;并且从arch/i386/kernel/head.S中的startup_32开始。现在在线性地址0x100000(1M)处开始就是我们的解压后的…...

建设网站的税点是多少/网站关键词怎么写

摘要&#xff1a;RDD&#xff1a;弹性分布式数据集&#xff0c;是一种特殊集合 ‚ 支持多种来源 ‚ 有容错机制 ‚ 可以被缓存 ‚ 支持并行操作&#xff0c;一个RDD代表一个分区里的数据集 RDD有两种操作算子&#xff1a;Transformation&#xff08;转换&#xff09;&#xff1…...

甘肃做网站哪家专业/查关键词热度的网站

Description 有N个相同的开关&#xff0c;每个开关都与某些开关有着联系&#xff0c;每当你打开或者关闭某个开关的时候&#xff0c;其他的与此开关相关联的开关也会相应地发生变化&#xff0c;即这些相联系的开关的状态如果原来为开就变为关&#xff0c;如果为关就变为开。你的…...

眉山 网站开发/如何做好精准营销

#includeint main(){int num,s1;scanf("%d",&num);while(num>0){ss*(num%10);num/10;}printf("每位数之积是&#xff1a;%d\\n",s);return 0;}扩展资料&#xff1a;三个循环的异同点&#xff1a;用while和do…while循环时&#xff0c;循环变量的初始…...

win2008 iis 新建网站/优化大师电脑版

转自&#xff1a;点击打开链接 十大经典排序算法0、排序算法说明0.1 排序的定义对一序列对象根据某个关键字进行排序。0.2 术语说明稳定&#xff1a;如果a原本在b前面&#xff0c;而ab&#xff0c;排序之后a仍然在b的前面&#xff1b;不稳定&#xff1a;如果a原本在b的前面&…...