在很多公司里面,大家都比较纠结代码规范的问题,大家经常会提及其他人的代码不符合规范,其他人也会提及另外人的代码不规范,一般来说,很多公司会在内部开会,提及让大家遵守规范,或者让大家在本地安装相关的插件,例如在idea上安装阿里巴巴的p3c的插件,让大家在写代码的时候自己进行检查,但是这种毕竟越到后面遵守的人也越少,所以这种代码规范相关的规则就一直施行不起来。那有什么办法可以确保这种规则给施行呢?对于我们来说,就是使用工具做阻断,比如使用git的hook钩子,在pre-commit阶段完成代码规范的检测,如果检测不通过则不能进行提交,如果检测通过则可以进行提交。所以本文我们介绍下使用checkstyle+git的hook钩子中的pre-commit钩子来实现代码规范的整改,这样会无形中普及所有人。下面来进行演示一下。
前置条件
1、这里我们主要是使用google的checkstyle框架来完成的,同时为了兼容jdk8.所以我们使用的checkstyle版本为9.3的版本
2、这里我们还需要准备checkstyle的规则文件,google-check-style.xml
3、上面两个文件都有提供,在本文末进行下载即可。
一、放入文件
这里我们为了顺利的使用git钩子做代码检查,那么涉及到的主要是checkstyle的可执行文件和checkstyle的规则文件,这里我们一般统一把它放到项目根目录下面的libs目录下,如下图:
我们这里是把这两个文件放到libs目录下面的。
二、编写git钩子
接下来我们只需要编写git钩子即可,找到当前项目的.git文件夹,如下图:
点击进去之后,找到对应的文件夹hooks目录
然后继续点击进去,新创建一个名称为pre-commit的文件
然后把下面的内容粘贴进去
#!/bin/bash # 获取所有待提交的Java文件 echo "[PRE-COMMIT] 开始执行pre-commit钩子..." echo "[PRE-COMMIT] 获取所有待提交的Java文件..." CHANGED_FILES=$(git diff --cached --name-only --diff-filter=ACM | grep -E '\.java$') # 如果没有Java文件被修改,直接通过检查 echo "[PRE-COMMIT] 检查是否有Java文件被修改..." if [ -z "$CHANGED_FILES" ]; then echo "[PRE-COMMIT] 没有修改Java文件,跳过检查" exit 0 fi # 定义checkstyle配置 echo "[PRE-COMMIT] 设置checkstyle配置..." CHECKSTYLE_JAR="./libs/checkstyle-9.3-all.jar" CHECKSTYLE_CONFIG="./libs/google-check-style.xml" # 检查checkstyle jar文件是否存在 echo "[PRE-COMMIT] 检查checkstyle jar文件是否存在..." if [ ! -f "$CHECKSTYLE_JAR" ]; then echo "[ERROR] Checkstyle jar文件不存在: $CHECKSTYLE_JAR" exit 1 fi # 检查checkstyle配置文件是否存在 echo "[PRE-COMMIT] 检查checkstyle配置文件是否存在..." if [ ! -f "$CHECKSTYLE_CONFIG" ]; then echo "[ERROR] Checkstyle配置文件不存在: $CHECKSTYLE_CONFIG" exit 1 fi # 对每个修改的Java文件执行checkstyle检查 echo "[PRE-COMMIT] 对修改的Java文件执行checkstyle检查..." success=true for file in $CHANGED_FILES; do if [ -f "$file" ]; then echo "[PRE-COMMIT] 检查文件: $file" echo "[PRE-COMMIT] 执行命令: java -jar $CHECKSTYLE_JAR -c $CHECKSTYLE_CONFIG $file" # 执行checkstyle并检查输出中是否有警告或错误 checkstyle_output=$(java -jar "$CHECKSTYLE_JAR" -c "$CHECKSTYLE_CONFIG" "$file" 2>&1) exit_code=$? # 输出checkstyle结果 echo "$checkstyle_output" # 如果有警告或错误,标记为失败 if [ $exit_code -ne 0 ] || echo "$checkstyle_output" | grep -q "WARN\|ERROR"; then echo "[ERROR] Checkstyle检查失败: $file" success=false fi else echo "[WARNING] 文件不存在: $file" fi done # 输出检查结果 echo "[PRE-COMMIT] Checkstyle检查完成" if $success; then echo "[PRE-COMMIT] 所有文件检查通过" exit 0 else echo "[ERROR] 部分文件检查失败,请修复后重新提交" exit 1 fi
到此我们的git钩子就做完了。
三、测试
1、这里我们在代码里面写一个不规范的测试类,如test1.java文件,我这里编写的示例代码是:
package org.example;
import sun.tools.jar.resources.jar;
public class Test1{
public static void main(String[] args){
String aaa="1";
if ( aaa.equals("1"))
System.out.println("111");
}
}这个示例代码有很多不符合规范的,我们使用sourcetree提交测试下。看看效果:
可以看到这里在提交的时候进行了代码风格的检查,并且没有通过,同时给出了相关的提示:部分文件检查失败,请修复后重新提交。
备注:
1、这里的git提交主要是针对本次新修改的文件进行检测,不会对未提交的老代码进行检测,方便大家对老代码的兼容。
2、这里如果希望对所有代码进行检测的话,可以在maven的pom.xml里面添加如下内容:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>3.2.2</version> <configuration> <configLocation>src/main/resources/google-check-style.xml</configLocation> <includeTestSourceDirectory>true</includeTestSourceDirectory> <consoleOutput>true</consoleOutput> <violationSeverity>warning</violationSeverity> <outputEncoding>UTF-8</outputEncoding> <failOnViolation>true</failOnViolation> <failsOnError>true</failsOnError> <!-- 排除不检查的代码,多个以逗号分割 --> <excludes>**/antlr4/**/*</excludes> </configuration> <dependencies> <!-- checkstyle真正执行的jar,与检查规则文件需要匹配,否则会报错 --> <dependency> <groupId>com.puppycrawl.tools</groupId> <artifactId>checkstyle</artifactId> <version>9.3</version> <scope>compile</scope> </dependency> </dependencies> <executions> <execution> <phase>validate</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
然后使用如下的命令进行检测:
mvn validate
示例效果如下:
3、这里默认使用的规则校验的话,使用的是google-check-style.xml,一般很多公司用不到那么全,或者需要定制修改的,可以修改google-check-style.xml文件,如果涉及到需要进行定制规则的,则下载checkstyle的源码,进行修改后重新打包checkstle.jar,对应的checkstyle的源码地址是:https://github.com/checkstyle/checkstyle
最后按照惯例,附上本案例的附件,登录后即可下载:







还没有评论,来说两句吧...