Skip to content
haichaoyuan edited this page Sep 28, 2018 · 6 revisions

Welcome to the p3c wiki!

手动构建

pmd 项目 打Jar 包

  1. pmd 项目, maven 构建
  2. 点击task里的 clean命令, package 命令,会在target文件下打出 jar包,直接使用
  3. install 命令,install 到 .m2 文件下

idea Plugin 构建

  1. gradle 项目,kotlin 语言
  2. ./gradlew clean buildDependents build, /build/distributions文件下

规则编写

官方PMD项目

pmd-bin

下载的pmd-bin-5.4.1【PMD可执行版本】

  • bin
  • designer.bat【界面工具,能将java源代码转化为AST(抽象语法树)】
  • bgastviewer.bat【界面工具,与designer.bat功能相似】cpd.bat【用来查找重复代码的工具,命令行版】,Mac 只能使用这个,也好用
  • cpdgui.bat【用来查找重复代码的工具,GUI版】
  • pmd.bat【Window平台下运行PMD需要使用的文件】
  • run.sh【Linux平台下运行PMD需要使用的文件】lib【该目录存放PMD运行依赖的jar包,包括第三方jar包和各种语言的模块jar包】

pmd-src

一些原先就有的规则,可以参考

  • pmd-core【PMD的核心执行调度模块】
  • pmd-java 【针对java语言的检测模块】
  • src ->main
  • rule 【该目录下存放已经编写好的java规则文件】
  • basic【基础类规则】
  • AvoidBranchingStatementAsLastInLoopRule.java【避免在循环的最后使用分支语句】
  • AvoidMultipleUnaryOperatorsRule.java【避免一元运算符的多重使用】
  • codesize【代码体积类规则】
  • resources
  • rulesets【java规则对应的xml文件】
  • android.xml【PMD运行时使用该文件会调用安卓类规则进行扫描】
  • basic.xml【PMD运行时使用该文件会调用基础类规则进行扫描】

注意: bat文件是window,mac 下使用sh文件,命令如下: ./run.sh bgastviewer

自定义规则实现思路

  1. 明确想要自定义的规则
  2. 列举会触发这种规则的所有不同的写法
  3. 使用 designer.bat 分析所有写法的抽象语法树的特定
  4. 编写规则代码捕捉这种特点
  5. 创建自己的xml规则文件,内容包括规则的相关信息
  6. 运行PMD 扫描错误代码,验证是否触发自定义规则

优先级别

priority:优先级别,从高到低依次是1-Blocker(阻塞), 2-Critical(危险), 3-Urgent(紧急), 4-important, 5-Warning;

P3C-PMD插件规则

P3C-PMD插件基于PMD实现了《阿里巴巴Java开发手册》中涉及的48条规则。(49)

  • 编程规约 (六)并发处理,实现了1、2、3、4、5、10、11、12等8条规则;
  • 编程规约(五)集合处理,实现了4、5、6、7、9、11等6条规则;
  • 编程规约(一)命名风格,实现了1、2、3、4、5、6、7、8、9、13等10条规则;
  • 编程规约(二)常量定义,实现了1、2等2条规则;
  • 编程规约(四)OOP规约,实现了5、6、7、8、9、12、17等7条规则;
  • 编程规约(七)控制语句,实现了1、2、4等3条规则;
  • 编程规约(八)注释规约,实现了1、2、3、4、5等5条规则;
  • 编程规约(九)其他,实现了1、3、4、5等4条规则;
  • 异常日志 (一)异常处理,实现了5、7、10等3条规则;

IDEA插件规则

4 条跨文件规则

  • 规则一: 禁止使用废弃的类和方法(deprecated)
  • 规则二: 来自接口或者抽象类的重写方法必须标记 @Override 注解。区分肉眼不好区分的字母o和数字0,可识别方法签名改变
  • 规则三: 静态方法和静态字段的外部使用,必须通过类来使用,而不是通过类的具体对象来使用
  • 规则四: hashCode 和 equals 的使用方法需遵循以下准则:
    • equals 方法被重写,hashCode 方法也需要被重写
    • 继承 Set接口的类必须重写这两个方法,因为需要确保没有重复的对象被插入
    • 当对象作为Map 的key 时,也需要重写这两个方法。(String 类就是重写这两个方法才能有幸作为Map 的Key)