Spotless Maven Plugin 3.11.0(Published 2026-11-02T21:21:09Z,约北京时间 11 月 3 日 05:21)把默认的 google-java-format 从 1.36.1 抬到 2.0.0。新默认会做非空白 cleanup:多余分号、空的注解括号、单参数 lambda 外包的括号都会被改掉。本机在 Spring Boot 3.4.5 的 @RestController 上跑 spotless:check / spotless:apply,@Override() 变成 @Override,(part) -> 变成 part ->;关掉 <cleanup>false</cleanup> 后这两处会留下。
同版本还加了 <maxLineLength>,可以改掉 GOOGLE / AOSP 默认的 100 列上限,要求 google-java-format 2.0.0 及以上。Gradle 插件同步发了 8.11.0,能力对齐。下面用 Maven 插件实测。
演示工程是最小 Spring Boot 3.4.5:父 POM 用 spring-boot-starter-parent,依赖 web 与 test,Java 21。Spotless 只开默认 googleJavaFormat:
<plugin>
<groupId>com.diffplug.spotless</groupId>
<artifactId>spotless-maven-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<java>
<googleJavaFormat/>
</java>
</configuration>
</plugin>
控制器故意留下官方 changelog 点名的三类写法:双分号、(part) ->、@Override():
@SpringBootApplication
@RestController
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "spring") String name) {
List<String> parts = List.of("hello", name);;
return parts.stream().map((part) -> part.toUpperCase()).collect(Collectors.joining("-"));
}
@Override()
public String toString() {
return "DemoApplication";
}
}
mvn -B -Dstyle.color=never spotless:check 退出码 1,diff 直接把三处点出来:
[ERROR] Failed to execute goal com.diffplug.spotless:spotless-maven-plugin:3.11.0:check ...
[ERROR] src/main/java/com/example/demo/DemoApplication.java
[ERROR] @@ -18,11 +18,11 @@
[ERROR] -····List<String>·parts·=·List.of("hello",·name);;
[ERROR] -····return·parts.stream().map((part)·->·part.toUpperCase()).collect(Collectors.joining("-"));
[ERROR] +····List<String>·parts·=·List.of("hello",·name);
[ERROR] +····return·parts.stream().map(part·->·part.toUpperCase()).collect(Collectors.joining("-"));
[ERROR] -··@Override()
[ERROR] +··@Override
[ERROR] Run 'mvn spotless:apply' to fix these violations.
mvn -q spotless:apply 之后,源码变成:
@GetMapping("/hello")
public String hello(@RequestParam(defaultValue = "spring") String name) {
List<String> parts = List.of("hello", name);
return parts.stream().map(part -> part.toUpperCase()).collect(Collectors.joining("-"));
}
@Override
public String toString() {
return "DemoApplication";
}
用 -X 跑 check 时能看到解析到的格式化包是 com.google.googlejavaformat:google-java-format:jar:2.0.0,和 Release 写的默认抬版本一致。同一份脏源码换回 Spotless Maven 3.10.0 再 apply:(part) -> 与 @Override() 仍在,双分号也常原样留下。3.11.0 默认才会把注解括号和单参数 lambda 括号一并清掉。
团队若只想保空白格式、不想被动改 AST,按 Release 加 <cleanup>false</cleanup>:
<googleJavaFormat>
<cleanup>false</cleanup>
</googleJavaFormat>
本机对同一份脏源码再 apply:lambda 仍是 (part) ->,注解仍是 @Override()。双分号还会被拆开成单独的 ;,那是空白侧排版,不是那三项非空白 cleanup。
另一处新参数是行宽。<maxLineLength>200</maxLineLength> 后,一条 108 列的字符串拼接 return 能整行留下;默认 100 列时同一行会被拆成多行 +。Release 写明:这个上限覆盖 GOOGLE / AOSP 预设的 100 列,且依赖 google-java-format 2.0.0+。
格式化后的工程 mvn -q -DskipTests package,再用 --server.port=18080 启动。日志出现 Started DemoApplication 后:
$ curl -fsS "http://127.0.0.1:18080/hello?name=boot"
HELLO-BOOT
$ curl -fsS "http://127.0.0.1:18080/hello"
HELLO-SPRING
对 Spring Boot 仓库来说,升到 Spotless Maven 3.11.0 不只是换版本号:CI 里原来能过的 @Override() / 单参数括号 lambda,下次 spotless:check 可能直接红。接受 gJF 2.0 的 cleanup 就跑一次 apply;要咬住旧语义就显式写 <cleanup>false</cleanup>。
参考:https://github.com/diffplug/spotless/releases/tag/maven/3.11.0
一起交流
分享你的思考,让讨论更进一步。