引入 wx-java-bom 导致 spring-data-redis 被强制降级到 2.3.3.RELEASE 且 scope 变为 provided,污染 Spring Boot 项目的 Redis 依赖
问题背景
旧的SpringBoot 3项目引入 weixin-java-miniapp 后,按照下方 README.md 内的代码也加入 pom.xml 之后,项目引用的 Redis CacheManager 报错,无法启动。
<properties>
<wx-java.version>4.8.3.B</wx-java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-bom</artifactId>
<version>${wx-java.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.8.4.B</version>
</dependency>
</dependencies>
如果将这个dependencyManagement wx-java-bom 去掉,则不会报错。
问题概述
在 Spring Boot 3.5.x 项目中通过 <scope>import</scope> 引入 wx-java-bom 后,项目里的 spring-data-redis 会被强制降级为 2.3.3.RELEASE(2020 年的版本),且 scope 被改为 provided,覆盖了 Spring Boot BOM 原本管理的 3.5.x 版本。
这会导致两个严重后果:
spring-data-redis 成为 provided 依赖,maven-dependency-plugin:copy-dependencies 不会将其拷贝进发布包的 lib 目录,运行时报 NoClassDefFoundError: RedisSerializer(仅部署到 Linux 服务器时报错,IDE / 本机 mvn spring-boot:run 因 classpath 完整而不报错,极易误导)。
- 2.3.3.RELEASE 的
Jackson2JsonRedisSerializer 构造函数签名为 (Class<T>),与 Spring Data Redis 3.x 的 (ObjectMapper, Class<T>) 不兼容,导致编译失败。
根因
问题出在根 pom wx-java 的 <dependencyManagement> 段。
wx-java-4.8.4.B.pom(develop 分支当前 pom.xml 亦同)中:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.3.3.RELEASE</version>
<optional>true</optional>
<scope>provided</scope>
</dependency>
|
<version>2.3.3.RELEASE</version> |
由于 wx-java-bom 的 <parent> 是 wx-java,而 Maven 在 <scope>import</scope> 引入 BOM 时,会将目标 BOM 及其 parent 链上的整个 <dependencyManagement> 合并到当前项目,于是这条 2.3.3.RELEASE + provided 规则被带入下游项目,覆盖了 Spring Boot BOM 对 spring-data-redis 的版本管理。
说明(仅为澄清机制):本项目实测确认,若直接声明 weixin-java-miniapp 依赖(不 import BOM),由于普通 <dependency> 的传递不会传播 parent pom 的 <dependencyManagement>,上述污染不会发生。触发条件是 import wx-java-bom。
复现步骤
环境:JDK 21/22、Spring Boot 3.5.15、WxJava 4.8.4.B
- 创建 Spring Boot 3.5.x 项目,pom 中加入:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>wx-java-bom</artifactId>
<version>4.8.4.B</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.8.4.B</version>
</dependency>
</dependencies>
- 执行依赖解析:
期望结果
org.springframework.data:spring-data-redis:jar:3.5.x:compile
版本与 scope 由 Spring Boot BOM 管理。
实际结果
org.springframework.data:spring-data-redis:jar:2.3.3.RELEASE:provided
完整 dependency tree(关键行):
[INFO] +- org.springframework.boot:spring-boot-starter-data-redis:jar:3.5.15:compile
[INFO] | \- org.springframework.data:spring-data-redis:jar:2.3.3.RELEASE:provided
[INFO] | +- org.springframework.data:spring-data-keyvalue:jar:3.5.12:provided
建议的修复方向
spring-data-redis 属于使用方(Spring Boot)管辖范围的依赖,WxJava 不应在其可被 import 的 BOM 链上对它做版本写死 + scope 改写。可选方案:
- (推荐) 从根 pom
wx-java 的 <dependencyManagement> 中移除 spring-data-redis 这一条。它本意应是可选编译依赖,改放到具体使用它的子模块(如 weixin-java-common)的 <dependencies> 里以 provided + optional 声明即可,这样既保留编译期可见,又不会随 BOM 传播污染下游版本仲裁。
- 或在 BOM 中不要继承该条管理规则(例如把
spring-data-redis 的版本改为 ${spring-data-redis.version} 之类由下游提供的属性,但这仍会改写 scope,治标)。
环境
- WxJava 版本:4.8.4.B(develop 分支 pom.xml 仍含此问题)
- Spring Boot:3.5.15
- JDK:21 / 22
- Maven:3.9.x
附件:
出问题的最小:pom.xml
问题说明md:README.md
引入
wx-java-bom导致spring-data-redis被强制降级到 2.3.3.RELEASE 且 scope 变为 provided,污染 Spring Boot 项目的 Redis 依赖问题背景
旧的SpringBoot 3项目引入 weixin-java-miniapp 后,按照下方
README.md内的代码也加入pom.xml之后,项目引用的Redis CacheManager报错,无法启动。问题概述
在 Spring Boot 3.5.x 项目中通过
<scope>import</scope>引入wx-java-bom后,项目里的spring-data-redis会被强制降级为 2.3.3.RELEASE(2020 年的版本),且 scope 被改为 provided,覆盖了 Spring Boot BOM 原本管理的 3.5.x 版本。这会导致两个严重后果:
spring-data-redis成为 provided 依赖,maven-dependency-plugin:copy-dependencies不会将其拷贝进发布包的 lib 目录,运行时报NoClassDefFoundError: RedisSerializer(仅部署到 Linux 服务器时报错,IDE / 本机mvn spring-boot:run因 classpath 完整而不报错,极易误导)。Jackson2JsonRedisSerializer构造函数签名为(Class<T>),与 Spring Data Redis 3.x 的(ObjectMapper, Class<T>)不兼容,导致编译失败。根因
问题出在根 pom
wx-java的<dependencyManagement>段。wx-java-4.8.4.B.pom(develop 分支当前 pom.xml 亦同)中:WxJava/pom.xml
Line 329 in 1697535
由于
wx-java-bom的<parent>是wx-java,而 Maven 在<scope>import</scope>引入 BOM 时,会将目标 BOM 及其 parent 链上的整个<dependencyManagement>合并到当前项目,于是这条2.3.3.RELEASE + provided规则被带入下游项目,覆盖了 Spring Boot BOM 对spring-data-redis的版本管理。复现步骤
环境:JDK 21/22、Spring Boot 3.5.15、WxJava 4.8.4.B
期望结果
版本与 scope 由 Spring Boot BOM 管理。
实际结果
完整 dependency tree(关键行):
建议的修复方向
spring-data-redis属于使用方(Spring Boot)管辖范围的依赖,WxJava 不应在其可被 import 的 BOM 链上对它做版本写死 + scope 改写。可选方案:wx-java的<dependencyManagement>中移除spring-data-redis这一条。它本意应是可选编译依赖,改放到具体使用它的子模块(如 weixin-java-common)的<dependencies>里以provided + optional声明即可,这样既保留编译期可见,又不会随 BOM 传播污染下游版本仲裁。spring-data-redis的版本改为${spring-data-redis.version}之类由下游提供的属性,但这仍会改写 scope,治标)。环境
附件:
出问题的最小:pom.xml
问题说明md:README.md