扩展阿里巴巴 Java 开发规约插件,打造团队专属风格!
逆锋起笔
共 7401字,需浏览 15分钟
·
2021-12-10 02:08
关注不迷路
1.前言
2.PMD静态代码扫描
2.1.PMD官网
https://pmd.github.io/
2.2.概述
潜在的bug:空的try/catch/finally/switch语句 未使用的代码:未使用的局部变量、参数、私有方法等 可选的代码:String/StringBuffer的滥用 复杂的表达式:不必须的if语句、可以使用while循环完成的for循环 重复的代码:拷贝/粘贴代码意味着拷贝/粘贴bugs 循环体创建新对象:尽量不要再for或while循环体内实例化一个新对象 资源关闭:Connect,Result,Statement等使用之后确保关闭掉
2.3.工作原理
2.4.规则分类
最佳实践:公认的最佳实践的规则。 代码风格:这些规则强制执行特定的编码风格。 设计:帮助您发现设计问题的规则。 文档:这些规则与代码文档有关。 容易出错的规则:用于检测被破坏的、非常混乱的或容易发生运行时错误的结构的规则。 多线程:这些规则在处理多个执行线程时标记问题。 性能:标记存在性能问题的代码的规则。 安全:显示潜在安全缺陷的规则。
2.5.编写PMD自定义规则
https://pmd.github.io/pmd-5.4.1/customizing/howtowritearule.html
https://testerhome.com/topics/4918
http://www.w3school.com.cn/xpath/index.asp
3.阿里巴巴Java开发规约插件p3c
3.1.GITHUB地址
https://github.com/alibaba/p3c
3.2.概述
p3c-pmd,提供大部分规则实现,基于PMD框架开发,如果想实现自己的规则,可以基于该模块开发(该模块基于maven编译打包) IntelliJ IDEA插件,即idea-plugin模块(该模块基于gradle编译打包) Eclipse插件,即eclipse-plugin,本文不介绍
3.3.阿里编码规约IDEA插件使用
传送门:https://github.com/alibaba/p3c/wiki/IDEA%E6%8F%92%E4%BB%B6%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3
4.基于p3c编写自定义编码规则
4.1.自定义规则
4.2.开发步骤
4.2.1.找出问题代码,使用pmd图形化工具解析成抽象语法树
package org.p3c.demo;
public class Demo {
public void methodA(int a) {
}
public void methodB(int a, int b, int c, int d, int e) {
}
}
4.2.2.分析抽象语法树
//CompilationUnit//MethodDeclarator
//CompilationUnit//MethodDeclarator/FormalParameters
4.2.3.p3c-pmd项目编写自定义代码规则
package com.alibaba.p3c.pmd.lang.java.rule.oop;
import com.alibaba.p3c.pmd.lang.java.rule.AbstractAliRule;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
import net.sourceforge.pmd.lang.java.ast.ASTFormalParameters;
import java.util.List;
/**
* 方法参数列表个数不宜过长
*
* @auther qingjian.wu
* @create 2018-01-27 14:59
*/
public class MethodParameterCountRule extends AbstractAliRule{
private static final String METHOD_XPATH = "//MethodDeclarator";
private static final Integer PARAMETER_COUNT_LIMIT = 5;
@Override
public Object visit(ASTCompilationUnit node, Object data) {
try {
// 找到所方法节点
ListmethodNodes = node.findChildNodesWithXPath(METHOD_XPATH);
if (methodNodes != null && methodNodes.size() > 0) {
for (Node methodNode : methodNodes) {
// 找到每个方法的参数列表声明
ListformalParameters = methodNode.findChildrenOfType(ASTFormalParameters.class);
if (formalParameters.get(0).getParameterCount() >= PARAMETER_COUNT_LIMIT) {
// 违反规则提示信息,第二个参数是提示信息位置,第三个参数是提示信息key,第四个参数用来替换提示信息
// 中的占位符,这里获取的节点image属性就是方法名称
addViolationWithMessage(data, methodNode,
"java.oop.MethodParameterCountRule.violation.msg",
new Object[]{methodNode.getImage()});
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
return super.visit(node, data);
}
}
4.2.4.p3c-pmd项目配置规则
"MethodParameterCountRule"
language="java"
message="java.oop.MethodParameterCountRule.rule.msg"
class="com.alibaba.p3c.pmd.lang.java.rule.oop.MethodParameterCountRule">
1
Negative example:
public void methodB(int a, int b, int c, int d, int e) {
}
]]>
Positive example:
public void methodA() {
}
]]>
4.2.5.p3c-pmd项目编写提示信息
"java.oop.MethodParameterCountRule.violation.msg">
"java.oop.MethodParameterCountRule.rule.msg">
4.2.6.单元测试
<test-data>
<code-fragment id="测试样例">
package org.p3c.demo;
public class Demo {
public void methodA(int a) {
}
public void methodB(int a, int b, int c, int d, int e) {
}
}
]]>
code-fragment>
<test-code>
<expected-problems>0expected-problems>
<code-ref id="测试样例" />
test-code>
test-data>
4.3.配置插件
4.3.1.p3c-pmd打包安装到本地maven仓库
mvn -DskipTests=true clean install
4.3.2.idea-plugin项目打包插件
clean buildDependents build
idea-plugin\p3c-idea\build\distributions\
目录下生成Alibaba Java Coding Guidelines-1.0.0.zip文件,这个就是我们加入了自己拓展阿里开发规约的插件,IDEA中安装此插件4.3.3.IDEA中使用编码规约插件
5.Maven打包加入PMD校验
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-pmd-pluginartifactId>
<version>3.8version>
<configuration>
<rulesets>
<ruleset>rulesets/java/ali-comment.xmlruleset>
<ruleset>rulesets/java/ali-concurrent.xmlruleset>
<ruleset>rulesets/java/ali-constant.xmlruleset>
<ruleset>rulesets/java/ali-exception.xmlruleset>
<ruleset>rulesets/java/ali-flowcontrol.xmlruleset>
<ruleset>rulesets/java/ali-naming.xmlruleset>
<ruleset>rulesets/java/ali-oop.xmlruleset>
<ruleset>rulesets/java/ali-orm.xmlruleset>
<ruleset>rulesets/java/ali-other.xmlruleset>
<ruleset>rulesets/java/ali-set.xmlruleset>
rulesets>
<printFailingErrors>trueprintFailingErrors>
<minimumPriority>1minimumPriority>
configuration>
<executions>
<execution>
<phase>packagephase>
<goals>
<goal>checkgoal>
goals>
execution>
executions>
<dependencies>
<dependency>
<groupId>com.alibaba.p3cgroupId>
<artifactId>p3c-pmdartifactId>
<version>1.3.3version>
dependency>
dependencies>
plugin>
plugins>
build>
6.总结
来源:blog.csdn.net/u014513883/
article/details/79186893
逆锋起笔
是一个专注于程序员圈子的技术平台,你可以收获最新技术动态
、最新内测资格
、BAT等大厂的经验
、精品学习资料
、职业路线
、副业思维
,微信搜索逆锋起笔
关注!
评论