使用自定义开发的 Checkstyle 检查

我们将指导您创建一个生成自定义检查的 jar 文件的 Maven 项目。然后,我们会将其作为依赖项添加到 Checkstyle 插件中,从而将其包含在您的一个项目中。

该插件还提供了定义包名称 XML 文档的能力,以便更轻松地引用您的自定义检查模块。

在此示例中,我们将使用Checkstyle 网站上的示例检查。

构建您的项目

首先,我们为自定义 ckecks 项目设置目录结构。它看起来像这样:

mycompany-checkstyle-checks
|-- pom.xml
`-- src
    `-- main
        `-- java
            `-- com
                `-- mycompany
                    `-- checks
                        |-- packagenames.xml
                        `-- MethodLimitCheck.java

现在我们将一次一个地浏览这三个文件中的每一个。

pom.xml

这里不多说,只是我们添加了对 Checkstyle 的依赖。

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany</groupId>
  <artifactId>mycompany-checkstyle-checks</artifactId>
  <name>MyCompany Checkstyle Checks</name>
  <version>1.0</version>
  <dependencies>
    <dependency>
      <groupId>checkstyle</groupId>
      <artifactId>checkstyle</artifactId>
        <version>3.1.2</version>
    </dependency>
  </dependencies>
</project>

包名.xml

此文件允许您指定希望能够使用的包的名称。在这里,我们将com.mycompany.checks添加到标准的 Checkstyle 包集中。这意味着您可以在 Checkstyle 配置文件中使用自定义检查,而无需指定它们的包名称。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE checkstyle-packages PUBLIC
  "-//Checkstyle//DTD Package Names Configuration 1.0//EN"
  "https://checkstyle.org/dtds/packages_1_0.dtd">

<checkstyle-packages>
  <package name="com.mycompany.checks"/>
  <package name="com.puppycrawl.tools.checkstyle">
    <package name="checks">
      <package name="blocks"/>
      <package name="coding"/>
      <package name="design"/>
      <package name="duplicates"/>
      <package name="header"/>
      <package name="imports"/>
      <package name="indentation"/>
      <package name="j2ee"/>
      <package name="javadoc"/>
      <package name="metrics"/>
      <package name="modifier"/>
      <package name="naming"/>
      <package name="sizes"/>
      <package name="whitespace"/>
    </package>
    <package name="filters"/>
  </package>
</checkstyle-packages>

MethodLimitCheck.java

这是来自 Checkstyle 网站的示例检查。它检查你的源文件没有超过 30 种方法。

package com.mycompany.checks;
import com.puppycrawl.tools.checkstyle.api.*;

public class MethodLimitCheck extends Check
{
    private int max = 30;

    public int[] getDefaultTokens()
    {
        return new int[]{TokenTypes.CLASS_DEF, TokenTypes.INTERFACE_DEF};
    }

    public void visitToken(DetailAST ast)
    {
        // find the OBJBLOCK node below the CLASS_DEF/INTERFACE_DEF
        DetailAST objBlock = ast.findFirstToken(TokenTypes.OBJBLOCK);
        // count the number of direct children of the OBJBLOCK
        // that are METHOD_DEFS
        int methodDefs = objBlock.getChildCount(TokenTypes.METHOD_DEF);
        // report error if limit is reached
        if (methodDefs > max) {
            log(ast.getLineNo(),
                "too many methods, only " + max + " are allowed");
        }
   }
}

为您的自定义检查项目构建 JAR

为了能够在其他项目中使用您的自定义检查,您需要打包并安装它们。为此,只需在命令行上运行它:

mvn install

这会生成一个包含以下内容的 JAR 文件并将其安装到您的本地存储库中。

mycompany-checkstyle-checks-1.0.jar

mycompany-checkstyle-checks-1.0.jar
|-- pom.xml
|-- META-INF
|   |-- MANIFEST.MF
|   `-- maven
|       `-- com.mycompany
|           `-- mycompany-checkstyle-checks
|               |-- pom.xml
|               `-- pom.properties
`-- com
    `-- mycompany
        `-- checks
            |-- packagenames.xml
            `-- MethodLimitCheck.class

在另一个项目中使用您的支票

现在您已准备好在另一个项目中使用您的自定义检查。

创建 Checkstyle 配置

在要使用自定义检查的项目的根目录中创建文件checkstyle.xml 。在此文件中,您告诉 Checkstyle 您要使用哪些检查。

注意:我们不必在此处指定检查的完全限定类名。那是因为我们之前使用了packagenames.xml文件。

<?xml version="1.0" ?>

<!DOCTYPE module PUBLIC
  "-//Checkstyle//DTD Checkstyle Configuration 1.2//EN"
  "https://checkstyle.org/dtds/configuration_1_2.dtd">

<module name="Checker">
  <module name="TreeWalker">
    <module name="MethodLimit"/>
  </module>
</module>

配置 Checkstyle 插件以使用您的自定义检查

最后,我们需要告诉其他项目您希望它使用您的自定义 Checkstyle 检查。在该项目的pom.xml中,添加以下配置。

注意:您必须在pom.xml<build>元素中指定对mycompany-checkstyle-checks的插件依赖项。它在<reporting>元素中不起作用,因为<reporting>不支持插件依赖项。其余的配置在<reporting>元素中以正常方式完成。

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.1.2</version>
        <dependencies>
          <dependency>
            <groupId>com.mycompany</groupId>
            <artifactId>mycompany-checkstyle-checks</artifactId>
            <version>1.0</version>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
  <reporting>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-checkstyle-plugin</artifactId>
        <version>3.1.2</version>
        <configuration>
          <configLocation>checkstyle.xml</configLocation>
        </configuration>
      </plugin>
    </plugins>
  </reporting>
  ...
</project>