如何配置Spotless以保留Java构建器的换行格式
解决Spotless合并构建器/AssertJ链式调用换行的问题
方案1:切换到Palantir Java Format(推荐)
Spotless默认使用的Google Java Format会自动合并短链式调用为单行,而Palantir Java Format是其分支,专门优化了对用户手动换行的保留,尤其适配构建器模式、AssertJ断言这类链式调用场景。
Gradle配置示例:
spotless { java { // 替换默认的Google Java Format palantirJavaFormat() // 可指定版本,比如 palantirJavaFormat("2.34.0") // 其他Spotless配置(如导入排序、license header等)保持不变 } }
Maven配置示例:
<plugin> <groupId>com.diffplug.spotless</groupId> <artifactId>spotless-maven-plugin</artifactId> <version>最新稳定版本</version> <configuration> <java> <palantirJavaFormat/> <!-- 可选指定版本:<palantirJavaFormatVersion>2.34.0</palantirJavaFormatVersion> --> </java> </configuration> </plugin>
切换后,只要你原本的构建器/assertThat语句是按换行风格编写的,Spotless会保留这种格式,不会强制合并为单行;如果是单行的短链式调用,也不会强制拆分,兼顾了一致性和自定义格式需求。
方案2:自定义规则(不推荐,仅作备选)
如果无法切换格式化引擎,可以通过Spotless的regexReplace规则强制匹配链式调用并保留换行,但这种方式需要维护正则表达式,容易出现误匹配或遗漏:
Gradle示例(针对构建器和AssertJ):
spotless { java { googleJavaFormat() // 继续使用默认引擎 // 匹配构建器链式调用,强制换行 regexReplace( '(\\.\\w+\\([^)]*\\))', '\n $1' ) // 针对assertThat单独调整 regexReplace( '(assertThat\\([^)]*\\))(\\.\\w+\\([^)]*\\))+', '$1\n $2' ) } }
注意:这种正则方式可能会误匹配其他链式调用,需要根据项目实际情况调整正则表达式,维护成本较高。
内容的提问来源于stack exchange,提问作者Zounadire
相关产品推荐
相关产品推荐

