阿里巴巴规约使用的是pmd代码静态分析工具,且是通过maven-pmd-plugin这个maven插件实现的。所以主要配置maven-pmd-plugin这个插件就能实现使用p3c对代码检查。
配置pom.xml
1 属性配置:配置properties节点
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version> <!-- Spring-Boot 项目不需要设置该项(因为parent中已设置) -->
</properties>
2 PMD插件配置
在build>plugins节点下添加如下配置
PMD插件配置
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.8</version>
<configuration>
<sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
<targetJdk>${java.version}</targetJdk>
<printFailingErrors>true</printFailingErrors>
<rulesets>
<ruleset>rulesets/java/ali-comment.xml</ruleset>
<ruleset>rulesets/java/ali-concurrent.xml</ruleset>
<ruleset>rulesets/java/ali-constant.xml</ruleset>
<ruleset>rulesets/java/ali-exception.xml</ruleset>
<ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
<ruleset>rulesets/java/ali-naming.xml</ruleset>
<ruleset>rulesets/java/ali-oop.xml</ruleset>
<ruleset>rulesets/java/ali-orm.xml</ruleset>
<ruleset>rulesets/java/ali-other.xml</ruleset>
<ruleset>rulesets/java/ali-set.xml</ruleset>
</rulesets>
</configuration>
<executions>
<execution>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>com.alibaba.p3c</groupId>
<artifactId>p3c-pmd</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</plugin>
3 编译插件配置:主要配置编译时使用的jdk版本(Spring-Boot 项目不需要设置,因为parent中已设置)
在build>plugins节点下添加如下配置
编译插件配置
<!-- 编译插件 Spring-Boot 项目不需要设置,因为parent中已设置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
4 整体配置
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.weibo</groupId>
<artifactId>hello</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>hello</name>
<url>http://maven.apache.org</url>
<!-- 属性配置 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
</properties>
<build>
<plugins>
<!-- PMD插件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-pmd-plugin</artifactId>
<version>3.8</version>
<configuration>
<sourceEncoding>${project.build.sourceEncoding}</sourceEncoding>
<targetJdk>${java.version}</targetJdk>
<printFailingErrors>true</printFailingErrors>
<!-- 代码检查规则 -->
<rulesets>
<ruleset>rulesets/java/ali-comment.xml</ruleset>
<ruleset>rulesets/java/ali-concurrent.xml</ruleset>
<ruleset>rulesets/java/ali-constant.xml</ruleset>
<ruleset>rulesets/java/ali-exception.xml</ruleset>
<ruleset>rulesets/java/ali-flowcontrol.xml</ruleset>
<ruleset>rulesets/java/ali-naming.xml</ruleset>
<ruleset>rulesets/java/ali-oop.xml</ruleset>
<ruleset>rulesets/java/ali-orm.xml</ruleset>
<ruleset>rulesets/java/ali-other.xml</ruleset>
<ruleset>rulesets/java/ali-set.xml</ruleset>
</rulesets>
</configuration>
<executions>
<!-- 绑定pmd:check到verify生命周期 -->
<execution>
<id>pmd-check-verify</id>
<phase>verify</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
<!-- 绑定pmd:pmd到site生命周期 -->
<execution>
<id>pmd-pmd-site</id>
<phase>site</phase>
<goals>
<goal>pmd</goal>
</goals>
</execution>
</executions>
<!-- p3c依赖 -->
<dependencies>
<dependency>
<groupId>com.alibaba.p3c</groupId>
<artifactId>p3c-pmd</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</plugin>
<!-- 编译插件 Spring-Boot 项目不需要设置,因为parent中已设置 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<!-- 用于生成错误到代码内容的链接 -->
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</reporting>
</project>
5 多模块项目配置请考虑简化配置,不要同样的配置所有项目都配置一遍。可以考虑使用parent标签或使用依赖作用域为<scope>import</scope>
。
Spring-Boot项目默认已经继承了parent,maven的单继承不允许再使用parent了,所以可以使用<scope>import</scope>
来简化配置。
参见:maven中import scope依赖方式解决单继承问题的理解
构建命令
pmd插件有两个goal:pmd:pmd, pmd:check
- pmd:pmd
该goal无论代码是否有误都会构建成功。会生成分析报告在target目录 - pmd:check
该goal如果代码检查不通过,构建失败。会生成分析报告在target目录
文件已经绑定pmd:pmd到site生命周期,pmd:check到verify生命周期
maven生命周期介绍请见:Maven入门指南⑦:Maven的生命周期和插件
构建结果示例
命令行输出
分析报告有两种形式,一种是xml,一种是html
target/pmd.xml
“`xml
**target/site/pmd.html**
使用浏览器打开
![这里写图片描述](http://docs.trustchain.com/download/attachments/983869/%E6%B7%B1%E5%BA%A6%E6%88%AA%E5%9B%BE_%E9%80%89%E6%8B%A9%E5%8C%BA%E5%9F%9F_20180627164425.png?version=1&modificationDate=1530090276000&api=v2)
# maven-jxr-plugin插件的使用
配置maven-jxr-plugin
```xml
<!-- 用于生成错误到代码内容的链接 -->
<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jxr-plugin</artifactId>
<version>2.3</version>
</plugin>
</plugins>
</reporting>
执行 mvn site ,打开target/site/pmd.html,发现行号位置生成了超链接
点击行号,可以浏览代码了