Spotless与java-code-format无法禁止通配符导入,Maven如何实现该规则?
用Maven强制执行禁止通配符导入规则的可行方案
Google Java规范明确禁止通配符导入,而google-java-format和Spotless默认无法单独强制执行该规则,以下是经过验证的Maven实现方案:
一、PMD 正确配置(解决你之前配置无效的问题)
如果之前自定义pmd.xml未生效,大概率是规则引用或插件绑定配置有误,以下是可直接复用的正确配置:
- 项目根目录创建
pmd.xml:
<?xml version="1.0"?> <ruleset name="Custom Import Rules" xmlns="http://pmd.sourceforge.net/ruleset/2.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sourceforge.net/ruleset/2.0.0 https://pmd.sourceforge.io/ruleset_2_0_0.xsd"> <description>Enforce no wildcard imports</description> <!-- 核心规则:禁止所有通配符导入 --> <rule ref="category/java/imports.xml/AvoidStarImport"/> <!-- 可选:额外检查未使用的导入 --> <rule ref="category/java/imports.xml/UnusedImports"/> </ruleset>
pom.xml中配置PMD插件,绑定到验证阶段并设置违规终止构建:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-pmd-plugin</artifactId> <version>3.21.0</version> <configuration> <rulesets> <ruleset>pmd.xml</ruleset> </rulesets> <failOnViolation>true</failOnViolation> <printFailingErrors>true</printFailingErrors> </configuration> <executions> <execution> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行 mvn verify 时,若代码中存在 import xxx.* 格式的导入,构建会直接失败,达到强制执行效果。
二、Checkstyle 方案(更简洁的开箱即用配置)
Checkstyle自带Google规范的配置,其中默认包含禁止通配符导入的规则,无需自定义规则文件:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-checkstyle-plugin</artifactId> <version>3.3.0</version> <configuration> <configLocation>google_checks.xml</configLocation> <failOnViolation>true</failOnViolation> </configuration> <executions> <execution> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
执行 mvn verify 即可自动检查并拦截通配符导入。
三、Spotless 补充配置(结合格式化与规则检查)
你提到Spotless无法强制执行该规则,其实可以通过集成Checkstyle规则实现:
<plugin> <groupId>com.diffplug.spotless</groupId> <artifactId>spotless-maven-plugin</artifactId> <version>2.37.0</version> <configuration> <java> <googleJavaFormat/> <!-- 引入Google规范的Checkstyle规则,包含禁止通配符导入 --> <checkstyle> <config>google_checks.xml</config> </checkstyle> </java> </configuration> <executions> <execution> <phase>verify</phase> <goals> <goal>check</goal> </goals> </execution> </executions> </plugin>
这样Spotless在格式化代码的同时,会同步检查并拦截通配符导入。
内容的提问来源于stack exchange,提问作者Paulo Oliveira
相关产品推荐
相关产品推荐

