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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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