You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Grails3.1.16中spring-security-rest与Guava间接Jar包冲突求助

解决Guava依赖冲突导致的NoSuchMethodError问题

这是典型的依赖版本冲突问题——你的Grails项目里同时存在两个不同版本的Guava库,且老旧的guava-base:r03被优先加载,导致新版本Guava(18.0)中才有的com.google.common.base.Platform.systemNanoTime()方法找不到。下面是具体的分析和可落地的解决思路:

问题根源

你手动声明了com.google.guava:guava:18.0,但spring-security-rest:2.0.0.M2插件依赖了非常老旧的Guava r03系列组件(包括guava-io、guava-base等)。Gradle的依赖解析机制可能让旧版本的类先被类加载器加载,当你的代码调用新版本Guava的方法时,就会抛出NoSuchMethodError。

解决思路

1. 排除插件中的旧Guava依赖

直接在build.gradle中配置,排除spring-security-rest插件引入的所有Guava相关旧依赖,让项目只使用你指定的18.0版本:

dependencies {
    compile "com.google.guava:guava:18.0"
    compile("org.grails.plugins:spring-security-rest:2.0.0.M2") {
        // 排除所有Guava旧依赖
        exclude group: 'com.google.guava'
    }
}

如果担心排除整个组有风险,也可以精准排除具体模块:

compile("org.grails.plugins:spring-security-rest:2.0.0.M2") {
    exclude group: 'com.google.guava', module: 'guava-io'
    exclude group: 'com.google.guava', module: 'guava-base'
    exclude group: 'com.google.guava', module: 'guava-annotations'
}

修改后可以运行gradle dependencies验证,确认旧版本的Guava依赖已经从树中消失。

2. 强制统一Guava版本

如果项目中有多个依赖都引入了不同版本的Guava,直接强制所有依赖使用你指定的版本更高效。在build.gradle中添加以下配置:

configurations.all {
    resolutionStrategy.force 'com.google.guava:guava:18.0'
}

这个配置会让Gradle忽略所有其他依赖声明的Guava版本,统一使用18.0,彻底避免版本冲突。

3. 升级Spring Security REST插件(可选)

如果你的Grails版本兼容,可以尝试升级spring-security-rest到更晚的稳定版本——后续版本的插件大概率已经更新了Guava依赖,从根源上避免这种老旧版本的冲突。不过升级前要确认插件版本和Grails 3.1.16的兼容性,避免引入新的问题。

验证步骤

  1. 执行gradle clean build --refresh-dependencies清理并重新拉取依赖
  2. 运行gradle dependencies查看依赖树,确认只有com.google.guava:guava:18.0存在
  3. 重启项目,测试你的LoadingCache初始化代码是否正常运行

内容的提问来源于stack exchange,提问作者Tom Boldan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:51:24