如何通过Spotless Maven插件在格式化时将通配符导入展开为单个导入?
嘿,这个需求我太熟了!之前帮团队里的小伙伴解决过几乎一模一样的问题——你现在用spotless-maven-plugin处理OpenAPI生成器产出的代码,团队明确要求不能用通配符导入,但OpenAPI默认生成的代码全是import xxx.*这种格式,之前你只找到移除通配符的办法,却不知道怎么把它正确替换成实际用到的单个导入,对吧?
其实Spotless本身的核心规则里没有直接提供“展开通配符导入”的功能,但我们可以借助它集成的Eclipse JDT格式化规则来实现这个效果——毕竟Eclipse的格式化器自带了分析代码依赖、把通配符导入替换为实际用到的单个类导入的配置项。
具体操作分两步走就好:
自定义Eclipse格式化配置文件
在项目根目录新建一个.eclipseformat.xml文件,里面专门配置导入相关的规则,确保通配符会被展开:<profile version="13"> <setting id="org.eclipse.jdt.core.formatter.imports.rewrite.wildcards" value="true"/> <setting id="org.eclipse.jdt.core.formatter.imports.wildcardThreshold" value="1"/> </profile>第一个配置是开启通配符导入的重写功能,第二个配置设置成1的意思是:哪怕只用到了通配符包下的一个类,也会用单个导入而不是通配符,相当于彻底禁用通配符导入,所有用到的类都会被展开成单独的导入语句。
在Spotless的Maven配置里引用这个自定义文件
修改你pom.xml里的Spotless插件配置,让它用上刚才的自定义格式化规则:<plugin> <groupId>com.diffplug.spotless</groupId> <artifactId>spotless-maven-plugin</artifactId> <version>记得替换成最新的稳定版本哦</version> <executions> <execution> <goals> <goal>apply</goal> </goals> </execution> </executions> <configuration> <java> <eclipse> <file>${project.basedir}/.eclipseformat.xml</file> </eclipse> <!-- 你原来的其他配置比如移除未使用导入、导入排序都可以保留 --> <imports> <removeUnused>true</removeUnused> </imports> </java> </configuration> </plugin>
这样配置之后,Spotless在执行格式化的时候,会调用Eclipse JDT的格式化器,自动分析代码里实际用到了哪些类,把所有通配符导入都展开成对应的单个导入语句,完全符合你们团队的规则。
对了,如果你之前用的是Google Java Format作为Spotless的格式化规则,那得注意了——它本身不支持展开通配符导入的功能,这种情况下建议切换到Eclipse JDT规则来实现你的需求。
备注:内容来源于stack exchange,提问作者user27021723

