代码规范检查工具 CheckStyle

功能

checkstyle 插件能帮助我们规范代码行为,尽可能地检查代码的坏味道。

配置

checkStyle 插件配置很简单,主要是分两步:引入插件,编写代码规则 xml。

引入插件的配置如下:

		<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-checkstyle-plugin</artifactId>
            <version>3.1.2</version>
            <configuration>
                <configLocation>${basedir}/src/main/resources/checkstyle.xml</configLocation>
                <includeTestSourceDirectory>false</includeTestSourceDirectory>
                <enableRulesSummary>false</enableRulesSummary>
            </configuration>
            <executions>
                <execution>
                    <id>compile</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

引入插件的坐标,在   中配置插件的一些属性, configLocation 配置了要使用的规则文件位置,如若不配置则默认使用 sun 公司提供的代码规范配置。includeTestSourceDirectory 是否检查测试代码规范 ,enableRulesSummary 是否开启规则摘要等等,详细的配置信息请点击

在标签中将 checkstyle 插件的 check 目标绑定到 default 生命周期的 compile 阶段。当使用 mvn compile 编译代码时,checkStyle 便会执行 check 目标,或者手动执行 mvn checkstyle:check

编写代码规则 xml:

代码规则已经有现成的模板,因此可以直接使用现成的模板,或者根据已有的模板进行修改。比如 sun 公司的代码规范,以及 google 的代码规范。以下是个人开发中经常使用的代码规则,可根据需要修改。

<?xml version="1.0"?>
<!DOCTYPE module PUBLIC
        "-//Puppy Crawl//DTD Check Configuration 1.1//EN"
        "http://www.puppycrawl.com/dtds/configuration_1_1.dtd">
<module name="Checker">
    <property name="localeLanguage" value="en"/>
    <module name="NewlineAtEndOfFile">
        <property name="lineSeparator" value="lf"/>
    </module>
    <module name="FileTabCharacter">
        <property name="fileExtensions" value="java,xml"/>
    </module>
    <module name="RegexpSingleline">
        <!-- \s matches whitespace character, $ matches end of line. -->
        <property name="format" value="\s+$"/>
        <property name="message" value="Line has trailing spaces."/>
    </module>
    <module name="TreeWalker">
        <module name="IllegalImport"/>
        <module name="RedundantImport"/>
        <module name="UnusedImports"/>
        <module name="NeedBraces"/>
     	<module name="JavadocMethod">
            <property name="scope" value="public"/>
      	</module>
        <module name="ModifierOrder"/>
        <module name="RedundantModifier"/>
        <module name="UpperEll"/>
        <module name="LeftCurly"/>
        <module name="NeedBraces"/>
        <module name="RightCurly"/>
        <module name="GenericWhitespace"/>
        <module name="WhitespaceAfter"/>
        <module name="NoWhitespaceBefore"/>
    </module>
</module>

需要注意的是,规则文件的目录名称需要与插件配置的地址一致,否则插件无法使用自己编写的规则。

代码缺陷检查工具 SpotBugs

功能

SpotBugs 的前身是 FindBugs,从字面意思很好理解就是帮我们的代码找 bug,当然这个 bug 指的是代码层面的,而不是业务上的。特别说明,SpotBugs 检查的是编译后的字节码文件,而非源代码。

配置

SpotBugs 的配置也很简单:引入插件依赖,并在插件中做配置即可

      <!--     SpotBugs 插件      -->
            <plugin>
                <groupId>com.github.spotbugs</groupId>
                <artifactId>spotbugs-maven-plugin</artifactId>
                <version>3.1.12</version>
                <dependencies>
                    <!-- 此处的依赖用于指定 spotbugs 的版本,不引入该依赖,插件默认会有一个提供一个版本 -->
                    <dependency>
                        <groupId>com.github.spotbugs</groupId>
                        <artifactId>spotbugs</artifactId>
                        <version>4.4.2</version>
                    </dependency>
                </dependencies>
                <executions>
                    <execution>
                        <id>spotbugs</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>check</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

由于 SpotBugs 是检查字节码文件,因此需要将 SpotBugs 的目标绑定到 compile 之后的阶段,上述配置将 SpotBugs 绑定到 default 生命周期的 verify 阶段,亦可以直接使用命令 mvn spotbugs:check 执行目标。

对于一些不需要 SpotBugs 检查的方法或者类需要在 pom 中引入如下依赖:

 
<dependency>
    <groupId>com.google.code.findbugs</groupId>
    <artifactId>annotations</artifactId>
    <version>3.0.1</version>
</dependency>
 

引入依赖后,在对应的类或者方法上添加 @SuppressFBWarnings("EI_EXPOSE_REP") 其中括号中替换为对应的错误类型,更多关于 SpotBugs 的配置信息请点击

测试覆盖率报告插件 Jacoco

功能

给单元测试生成测试覆盖率报告,覆盖率报告可以详细的查看测试覆盖到的地方。

配置

给 Junit 测试生成测试报告配置如下:

			<plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <version>0.8.7</version>
                <executions>
                    <execution>
                        <id>default-prepare-agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-report</id>
                      	<phase>verify</phase>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>default-check</id>
                        <goals>
                            <goal>check</goal>
                        </goals>
                        <configuration>
                            <rules>
                                <rule>
                                    <element>BUNDLE</element>
                                    <limits>
                                        <limit>
                                            <counter>COMPLEXITY</counter>
                                            <value>COVEREDRATIO</value>
                                            <minimum>0.60</minimum>
                                        </limit>
                                    </limits>
                                </rule>
                            </rules>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

配值 Jacoco 的 report 目标绑定到 verify 阶段,当运行 mvn verify命令时,会生成代码测试覆盖率报告。

Jacoco 排除文件的配置也需要注意:当我们既需要在生成报告中排除,又需要在检查测试覆盖率中排除时,可以在插件依赖下声明如下,configuration 与插件的 executions在同一级。

<configuration>
      <excludes>
           <exclude>com/greek/shop/entity/*</exclude>
      </excludes>
</configuration>

仅需要在某些目标执行是过滤文件,则在对应目标的配置中加入上面的代码。例如要在 report 目标中排除文件,则要在 report 对应的 execution 里面添加上面的配置。

官方文档中针对单元测试和集成测试有不同的配置方法请点击查看,关于 report 的具体配置,以及相关参数也可点击这里