Alibaba P3C

Alibaba P3C

Maven

代码质量审查,需要用到阿里规约的检查,尽管建议大家在客户端自己的 IDE 中进行了扫描,但是难免会有人忘记。因此,在 CI 过程中,利用 maven 插件做一次统一的自动化扫描。

<?xml version="1.0" encoding="UTF-8"?>
<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>

    <!-- ...... -->

    <properties>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <!-- java8 保留参数名编译参数,支持 action 带参 -->
                    <compilerArgument>-parameters</compilerArgument>
                    <compilerArguments>
                        <verbose/>
                    </compilerArguments>
                </configuration>
            </plugin>

            <!-- 编码规约扫描命令:mvn pmd:pmd-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-pmd-plugin</artifactId>
                <version>3.8</version>
                <configuration>
                    <rulesets>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-comment.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-concurrent.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-constant.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-exception.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-flowcontrol.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-naming.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-oop.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-orm.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-other.xml</ruleset>
                        <ruleset>src/main/resources/p3c-pmd/rulesets/java/ali-set.xml</ruleset>
                    </rulesets>
                    <printFailingErrors>true</printFailingErrors>
                </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.6</version>
                    </dependency>
                </dependencies>
            </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>

配置完毕后,执行 mvn site 即可以生成报告,找到 target 目录下的 index.html 点击打开;找到 target 目录下的 pmd.html 打开。

CI 集成

根据需求绑定到不同的生命周期,例如:绑定到 package 阶段,修改 executions 即可。

<!--绑定pmd:check到verify生命周期-->
<execution>
    <id>pmd-check-verify</id>
    <phase>package</phase>
    <goals>
        <goal>check</goal>
    </goals>
</execution>

根据需求控制每次需要检查的规约,例如:只检查命名规范,则需要修改 rulesets 标签中的内容,只保留 naming 这一条规则。注释其他的规则。

<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>

Gradle

IDE

IDEA

&lsquo;Alibaba Java Coding Guidelines&rsquo; plugin