Skip to content

引入 wx-java-bom 导致 spring-data-redis 被强制降级到 2.3.3.RELEASE 且 scope 变为 provided,污染 Spring Boot 项目的 Redis 依赖 #4058

Description

@CNBroderick

引入 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 版本。

这会导致两个严重后果:

  1. spring-data-redis 成为 provided 依赖,maven-dependency-plugin:copy-dependencies 不会将其拷贝进发布包的 lib 目录,运行时报 NoClassDefFoundError: RedisSerializer(仅部署到 Linux 服务器时报错,IDE / 本机 mvn spring-boot:run 因 classpath 完整而不报错,极易误导)。
  2. 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>

WxJava/pom.xml

Line 329 in 1697535

<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

  1. 创建 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>
  1. 执行依赖解析:
mvn dependency:list

期望结果

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 改写。可选方案:

  1. (推荐) 从根 pom wx-java<dependencyManagement> 中移除 spring-data-redis 这一条。它本意应是可选编译依赖,改放到具体使用它的子模块(如 weixin-java-common)的 <dependencies> 里以 provided + optional 声明即可,这样既保留编译期可见,又不会随 BOM 传播污染下游版本仲裁。
  2. 或在 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions