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

升级Groovy从2.5.23到4.0.25后,Slf4j搭配Logback出现加载失败问题

升级Groovy从2.5.23到4.0.25后,Slf4j搭配Logback出现加载失败问题

这个问题我之前也碰到过,核心原因是Groovy 4.x的类加载机制、依赖处理逻辑和2.5.x版本有不少差异,再加上SLF4J 2.x的日志实现加载方式变化,才导致Logback没有被SLF4J正确识别,最终触发了NOPLogger的错误。

问题根源拆解

  • SLF4J 2.x的加载机制变更:Logback 1.5.x属于SLF4J 2.x生态,SLF4J 2.x改用ServiceLoader机制查找日志实现,而不是旧版本的静态绑定。如果Logback的类没有被加载到SLF4J能访问的类加载器中,SLF4J就会默认使用无操作的NOPLogger,而这个Logger没有setLevel()方法,自然报错。
  • Groovy 4的类加载隔离:Groovy 4对Grape依赖的加载时机和类加载器隔离做了调整,在你调用setupLibraryLoggers()的时候,Grape可能还没完成Logback依赖的加载,或者加载后的类不在SLF4J的类加载器可见范围内。
  • 潜在的版本冲突:Groovy 4本身可能自带了旧版本的SLF4J API,和你引入的Logback 1.5.x(需要SLF4J 2.x)不兼容,进一步导致provider加载失败。

具体解决方案

这里给你三个可行的解决办法,按推荐优先级排序:

方案一:调整类加载策略(最直接)

给Runner.groovy添加@GrabConfig(systemClassLoader=true)注解,让Grape把依赖加载到系统类加载器中,这样SLF4J的ServiceLoader就能顺利找到Logback的provider:

@Grapes(
    [
        @Grab(group = 'org.eclipse.jgit', module = 'org.eclipse.jgit', version = '7.1.0.202411261347-r'),
        @Grab(group = 'ch.qos.logback', module = 'logback-classic', version = '1.5.16'),
        @Grab(group='de.gesellix', module='docker-client', version='2025-01-19T00-00-00'),
        @Grab(group='commons-io', module='commons-io', version='2.18.0'),
        @Grab(group='org.apache.commons', module='commons-compress', version='1.27.1')
    ]
)
@GrabConfig(systemClassLoader=true) // 新增这个注解
import static Logging.setupLogger
import static Logging.setupLibraryLoggers

Logging.setupLibraryLoggers()
log = Logging.setupLogger()
log.info("Test")

方案二:强制提前加载Logback类

在调用日志初始化方法前,先手动加载Logback的核心类,触发Grape提前完成依赖加载:

@Grapes([...]) // 原依赖不变
import static Logging.setupLogger
import static Logging.setupLibraryLoggers

// 提前加载Logback核心类,触发Grape加载依赖
new ch.qos.logback.classic.LoggerContext()

Logging.setupLibraryLoggers()
log = Logging.setupLogger()
log.info("Test")

方案三:显式指定SLF4J API版本

确保SLF4J API和Logback版本完全兼容(Logback 1.5.16对应SLF4J 2.0.16),在依赖中显式添加SLF4J API:

@Grapes(
    [
        @Grab(group='org.slf4j', module='slf4j-api', version='2.0.16'), // 新增SLF4J API依赖
        @Grab(group = 'org.eclipse.jgit', module = 'org.eclipse.jgit', version = '7.1.0.202411261347-r'),
        @Grab(group = 'ch.qos.logback', module = 'logback-classic', version = '1.5.16'),
        @Grab(group='de.gesellix', module='docker-client', version='2025-01-19T00-00-00'),
        @Grab(group='commons-io', module='commons-io', version='2.18.0'),
        @Grab(group='org.apache.commons', module='commons-compress', version='1.27.1')
    ]
)
import static Logging.setupLogger
import static Logging.setupLibraryLoggers

Logging.setupLibraryLoggers()
log = Logging.setupLogger()
log.info("Test")

验证建议

优先尝试方案一,它不需要调整代码逻辑,只需要加一个注解就能解决类加载可见性问题。如果还是有问题,再试试方案二或方案三。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.15 03:18:13