You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java 21+Spring Boot 2.7.18+MyBatis 3.5.10项目启动报错:BaseObjectPoolConfig不存在指定私有字段

Java 21+Spring Boot 2.7.18+MyBatis 3.5.10项目启动报错:BaseObjectPoolConfig不存在指定私有字段

看起来你遇到的是典型的依赖版本冲突问题,我来帮你拆解一下并给出解决思路:

问题本质分析

这个NoSuchFieldError报错的核心原因是:项目运行时加载的org.apache.commons.pool2.impl.BaseObjectPoolConfig类版本,和代码编译时依赖的版本不一致。Apache Commons Pool2的不同版本中,DEFAULT_DURATION_BETWEEN_EVICTION_RUNS这个字段的可见性(私有/公开)或者定义方式发生了变化,而你项目里的commons-dbcp2依赖在启动时调用了这个字段,导致找不到对应定义。

具体解决步骤

  • 第一步:排查依赖树,定位冲突版本
    先通过构建工具查看项目的依赖树,找出所有org.apache.commons:commons-pool2的实例,确认是否存在多个版本:

    • Maven项目执行命令:mvn dependency:tree
    • Gradle项目执行命令:./gradlew dependencies
      重点看是否有其他依赖(比如自定义引入的库、MyBatis相关扩展)悄悄引入了更高或更低版本的Pool2,和Spring Boot 2.7.18默认依赖的版本不一致。
  • 第二步:统一Commons Pool2版本
    Spring Boot 2.7.18默认依赖的Commons Pool2版本是2.11.1,你可以通过依赖管理来强制项目使用这个版本,避免冲突:

    • 如果是Maven项目,在pom.xmldependencyManagement节点中添加:
      <dependencyManagement>
          <dependencies>
              <dependency>
                  <groupId>org.apache.commons</groupId>
                  <artifactId>commons-pool2</artifactId>
                  <version>2.11.1</version>
              </dependency>
          </dependencies>
      </dependencyManagement>
      
    • 如果是Gradle项目,在build.gradle中通过BOM或者直接指定版本:
      // 方式1:通过Spring Boot BOM统一管理
      dependencyManagement {
          imports {
              mavenBom "org.springframework.boot:spring-boot-dependencies:2.7.18"
          }
      }
      
      // 方式2:直接指定版本
      implementation 'org.apache.commons:commons-pool2:2.11.1'
      
  • 第三步:检查Commons DBCP2依赖兼容性
    如果你手动引入了commons-dbcp2,要确保它的版本和Spring Boot 2.7.x的依赖兼容(Spring Boot 2.7.18对应的dbcp2版本是2.9.0),不要手动指定过高版本,否则会自动拉取不兼容的Pool2版本。建议使用Spring Boot提供的starter:spring-boot-starter-jdbc,它会自动帮你管理所有JDBC相关依赖的版本。

  • 第四步:清理缓存并重新构建
    有时候本地仓库的依赖文件可能损坏,执行以下命令强制刷新依赖并重新构建:

    • Maven:mvn clean install -U
    • Gradle:./gradlew clean build --refresh-dependencies

额外建议

你提到有一个类似配置的项目能正常运行,可以把两个项目的依赖树导出对比,看看失败的项目多了哪些依赖,或者某个依赖的版本不同,这往往能快速定位问题根源。

备注:内容来源于stack exchange,提问作者Mr Smith

火山引擎 最新活动