我们将指导您创建一个生成自定义检查的 jar 文件的 Maven 项目。然后,我们会将其作为依赖项添加到 Checkstyle 插件中,从而将其包含在您的一个项目中。
该插件还提供了定义包名称 XML 文档的能力,以便更轻松地引用您的自定义检查模块。
在此示例中,我们将使用Checkstyle 网站上的示例检查。
首先,我们为自定义 ckecks 项目设置目录结构。它看起来像这样:
mycompany-checkstyle-checks
|-- pom.xml
`-- src
`-- main
`-- java
`-- com
`-- mycompany
`-- checks
|-- packagenames.xml
`-- MethodLimitCheck.java
现在我们将一次一个地浏览这三个文件中的每一个。
这里不多说,只是我们添加了对 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>4.4</version>
</dependency>
</dependencies>
</project>
此文件允许您指定希望能够使用的包的名称。在这里,我们将com.mycompany.checks添加到标准的 Checkstyle 包集中。这意味着您可以在 Checkstyle 配置文件中使用自定义检查,而无需指定它们的包名称。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE checkstyle-packages PUBLIC
"-//Puppy Crawl//DTD Package Names 1.0//EN"
"http://www.puppycrawl.com/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>
这是来自 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");
}
}
}
为了能够在其他项目中使用您的自定义检查,您需要打包并安装它们。为此,只需在命令行上运行它:
mvn install
这会生成一个包含以下内容的 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.xml 。在此文件中,您告诉 Checkstyle 您要使用哪些检查。
注意:我们不必在此处指定检查的完全限定类名。那是因为我们之前使用了packagenames.xml文件。
<?xml version="1.0" ?>
<!DOCTYPE module PUBLIC
"-//Puppy Crawl//DTD Check Configuration 1.2//EN"
"http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
<module name="Checker">
<module name="TreeWalker">
<module name="MethodLimit"/>
</module>
</module>
最后,我们需要告诉其他项目您希望它使用您的自定义 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>2.3</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>2.3</version>
<configuration>
<configLocation>checkstyle.xml</configLocation>
<packageNamesLocation>com/mycompany/checks/packagenames.xml</packageNamesLocation>
</configuration>
</plugin>
</plugins>
</reporting>
...
</project>