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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白参加红队,需要做好哪些准备?

在本文中,我们将为读者介绍要想加入红队,需要掌握哪些方面的技能。 CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 护网的定义是以国家组织组织事业单位、国企单位、名企单位等开展攻防两方的网络安全演习。进攻方一个…

Mysql加密功能

Mysql加密功能 InnoDB加密功能查询条件问题开启整个数据库加密 InnoDB加密功能 InnoDB是MySQL数据库引擎的一种,它提供了加密存储的功能。具体来说,InnoDB引擎支持以下两种方式的加密存储: 表级加密:InnoDB支持表级加密&#xff…

编译opencv.js

opencv 支持编译多个平台,其中还支持JavaScript,不过编译需要emscripten 编译环境:centos7,Python2.7 1.下载OpenCV源码 官网:https://opencv.org/releases/ 例如下载4.8.0版本: https://github.com/ope…

【广州华锐互动】元宇宙技术如何赋能传统工业企业?

随着科技的飞速发展,我们正处于工业革命4.0的时代,数字化、网络化和智能化正在深刻地改变着我们的生活和工作方式。在这个变革的大潮中,工业元宇宙平台应运而生,为企业带来了前所未有的机遇和挑战。 广州华锐互动开发的工业元宇宙…

咖啡店小程序:吸引顾客的创新营销手段

近日,“酱香拿铁”的大火让大家再次把目标聚焦在年轻人都喜欢的咖啡上。现在咖啡已经成为年轻一代的社交硬通货,咖啡店也遍地开花。而随着移动互联网的快速发展,咖啡店小程序已经成为了各大咖啡店主的选择,因为它提供了便捷的方式…

pytorch搭建squeezenet网络的整套工程,及其转tensorrt进行cuda加速

本来,前辈们用caffe搭建了一个squeezenet的工程,用起来也还行,但考虑到caffe的停更后续转trt应用在工程上时可能会有版本的问题所以搭建了一个pytorch版本的。 以下的环境搭建不再细说,主要就是pyorch,其余的需要什么p…

Gradle下载库速度过慢解决办法

最近搞了个Gradle的项目,项目下载依赖库太慢了,于是… Gradle下载库速度过慢的问题可能由多种原因导致,以下是一些可能的解决方案: 1、使用国内镜像站点: 你可以改变Gradle的配置,使用国内的镜像站点来下…

go开发之个人微信的开发

简要描述: 检测好友状态 请求URL: http://域名地址/checkZombie 请求方式: POST 请求头Headers: Content-Type:application/jsonAuthorization:login接口返回 参数: 参数名必选类型说明…

SpringCloudAlibaba Gateway(一)简单集成

SpringCloudAlibaba Gateway(一)简单集成 随着服务模块的增加,一定会产生多个接口地址,那么客户端调用多个接口只能使用多个地址,维护多个地址是很不方便的,这个时候就需要统一服务地址。同时也可以进行统一认证鉴权的需求。那么服…

go语言基础操作---七

socket简单介绍—套接字编程 什么是Socket Socket,英文含义是【插座、插孔】,一般称之为套接字,用于描述IP地址和端口。可以实现不同程序间的数据通信。 Socket起源于Unix,而Unix基本哲学之一就是“一切皆文件”,都可…

[移动通讯]【Carrier Aggregation in LTE】【 Log analysis-2】

前言: 接 [移动通讯]【Carrier Aggregation in LTE】【 Theory Log analysis-1】 这里面 主要讲解一下日志分析 目录: 总体流程 UE Capbaility Information MeasurementReport RRC Connection Reconfiguration RRCConnectionReconfiguration…

如何阅读一本书(上)

《如何阅读一本书》是一本经典的阅读指南,旨在帮助读者在阅读过程中实现不同层次的理解和享受阅读的最大化。全书分为四个部分,介绍了阅读的不同层次、检查性阅读的艺术、分析性阅读的方法和同题阅读的技巧。该书提供了实用的建议和例子,适用…

开源药店商城系统源码比较:哪个适合你的药品电商业务

在构建药品电商业务时,选择适合的药店商城系统源码是至关重要的决策之一。开源药店商城系统源码提供了快速入门的机会,但在选择之前,您需要仔细考虑您的需求、技术要求和可扩展性。本文将比较几个流行的开源药店商城系统源码,以帮…

LSTM基础

LSTM 视频讲得非常好 https://www.bilibili.com/video/BV1644y1W7sD/?spm_id_from333.788&vd_source3b42b36e44d271f58e90f86679d77db7门的概念 过去,不过去,过去一部分 点乘,0 concatenation,pointwise LSTM RNN 上一…

深度学习Pytorch常用api详解记录

深度学习常用的torch函数 torch.cat()torch.Tensor.repeat():持续更新中... torch.cat() 对象:给定的序列化张量,即Tensor型。 功能:实现两个张量在指定维度上的拼接。 输出:拼接后的张量。 函数以及参数:…

C/C++之链表的建立

个人主页:点我进入主页 专栏分类:C语言初阶 C语言程序设计————KTV C语言小游戏 C语言进阶 C语言刷题 欢迎大家点赞,评论,收藏。 一起努力,一起奔赴大厂。 目录 1.头插 1.1简介 1.2代码实现头插 …

Spring Cloud Gateway 实现原理

Spring Cloud Gateway是Spring Cloud生态系统中的一个组件,用于构建基于Spring Boot的微服务架构中的网关服务。它的主要目的是提供一种灵活的方式来路由、过滤和转换HTTP请求,从而允许您构建强大、高性能的微服务应用程序。 以下是Spring Cloud Gatewa…

系统报错“由于找不到msvcp140.dll无法继续执行代码”的处理方法

我在使用电脑时,突然发现了一个错误提示:“无法启动程序,因为找不到msvcp140.dll文件”。这让我非常困惑,因为我确定这个文件应该存在于我的电脑上。但是电脑依然报错“由于找不到msvcp140.dll无法继续执行代码”,这个…

Java为什么有流,流的设计原则是什么?

目录 流的设计原则 为什么是一次性的? 流的设计原则 流的设计原则主要包括以下几个方面: 简单性和一致性:流的接口应该尽可能简单和一致,以使其易于使用和理解。流的操作应该在不同类型的流之间具有一致的行为,使程序…

java jpa查询没有id的表的方法

一、前言 jpa中,如果想查询数据库,必须有一个Entity实体类,这个类的内容要与数据库表的列一一对应; 并且这个类中,必须有一个Long id字段,对应数据库表中的id列。 IdGeneratedValue(strategy GenerationT…