Grails3.1.16中spring-security-rest与Guava间接Jar包冲突求助
这是典型的依赖版本冲突问题——你的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的兼容性,避免引入新的问题。
验证步骤
- 执行
gradle clean build --refresh-dependencies清理并重新拉取依赖 - 运行
gradle dependencies查看依赖树,确认只有com.google.guava:guava:18.0存在 - 重启项目,测试你的
LoadingCache初始化代码是否正常运行
内容的提问来源于stack exchange,提问作者Tom Boldan

