我们将指导您创建一个生成自定义检查的 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>2.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.4</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.4</version> <configuration> <configLocation>checkstyle.xml</configLocation> <packageNamesLocation>com/mycompany/checks/packagenames.xml</packageNamesLocation> </configuration> </plugin> </plugins> </reporting> ... </project>