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

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。