阿里巴巴Java规约p3c-pmd与maven集成

阿里巴巴规约使用的是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

  1. pmd:pmd
    该goal无论代码是否有误都会构建成功。会生成分析报告在target目录
  2. pmd:check
    该goal如果代码检查不通过,构建失败。会生成分析报告在target目录
    文件已经绑定pmd:pmd到site生命周期,pmd:check到verify生命周期

maven生命周期介绍请见:Maven入门指南⑦:Maven的生命周期和插件

构建结果示例

  1. 命令行输出
    这里写图片描述

  2. 分析报告有两种形式,一种是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,发现行号位置生成了超链接
这里写图片描述
点击行号,可以浏览代码了
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013786868/article/details/80945721