
本文详解 spring-boot-maven-plugin 中 的真实作用——它不移除依赖,而是防止 Lombok 等仅需编译期存在的库被错误打包进最终可执行 JAR;同时厘清其与 (用于解决传递依赖冲突)的本质区别。
本文详解 `spring-boot-maven-plugin` 中 `
在 Spring Boot 项目中,当你引入 Lombok 时,常会发现 pom.xml 中自动出现如下配置:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>⚠️ 关键澄清:这不是 Maven 依赖排除(
✅ 的真实语义:控制「打包内容」,而非「依赖解析」
spring-boot-maven-plugin 的
? 在执行 mvn package 构建可执行 JAR/WAR 时,跳过将指定依赖(如 lombok)复制到 BOOT-INF/lib/ 目录中;
? 但该依赖仍完整保留在编译类路径(compile scope)中,确保 @Getter、@Data 等注解能被 lombok 注解处理器正常处理;
? 最终生成的 JAR 不含 lombok.jar,既减小体积,又避免运行时因重复加载或版本冲突引发的 NoClassDefFoundError 或 IncompatibleClassChangeError。
✅ 正确的 Lombok 声明方式(推荐 optional=true):
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> <!-- 明确声明:不传递给下游模块 --> </dependency>optional=true 进一步强化语义:Lombok 仅对当前模块编译必需,不应成为其他模块的间接依赖。
❌ 常见误解:混淆 与
| 配置位置 | 所属标签 | 作用域 | 典型用途 |
|---|---|---|---|
| 构建插件行为 | 控制最终打包产物中是否包含某依赖(如排除 Lombok、log4j2-api) | ||
| 依赖解析过程 | 解决传递依赖冲突(如 A 和 B 都依赖不同版本的 snakeyaml,需排除其中一个) |
例如,若 dependency-a 和 dependency-b 均传递引入 snakeyaml,应使用
<dependency>
<groupId>com.example</groupId>
<artifactId>dependency-b</artifactId>
<exclusions>
<exclude>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
</exclude>
</exclusions>
</dependency>
<!-- 然后显式声明所需版本 -->
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.2</version> <!-- 覆盖所有传递引用 -->
</dependency>而 绝不应 为 snakeyaml 在 spring-boot-maven-plugin 中添加
✅ 最佳实践总结
Lombok 等纯编译期工具(如 mapstruct-processor、spring-boot-configuration-processor)
→ 保持(由 Spring Boot Starter 自动配置或手动添加),并设 optional=true。 运行时必需的传递依赖(如 snakeyaml、jackson-databind、slf4j-api)
→ 禁止 在 spring-boot-maven-plugin 中;应通过 (如 2.2>)或直接声明 dependency 方式统一版本。 -
验证是否生效:
执行 mvn clean package 后检查 target/*.jar:jar -tf target/myapp-0.0.1-SNAPSHOT.jar | grep lombok # 应无输出 → 表明已成功排除
? 提示:Spring Boot 3.x+ 默认启用 spring-boot-maven-plugin 的智能排除逻辑,Lombok、spring-boot-devtools 等常见编译/开发期依赖会被自动识别并排除,无需手动配置
—— 除非你使用了非标准坐标或自定义插件配置。
遵循以上原则,即可精准控制依赖生命周期,兼顾编译效率、运行稳定与包体积优化。










