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

Logback 1.3.0与Jetty 9.4.50兼容性问题:Jetty启动无日志求助

Logback无法加载配置文件的原因及解决办法

核心问题:Servlet API版本冲突导致Logback初始化失败

Jetty 9.4.50自带的是Servlet 3.1.0 API,而你使用的Logback 1.3.0依赖的是Servlet 4.0.1。当应用部署到Jetty时,容器会优先加载自身的Servlet API,Logback找不到它预期的4.0.1版本类/方法,初始化流程直接中断,自然无法加载logback.xml生成日志。本地运行正常是因为本地类路径中使用的是Logback依赖的4.0.1版本,版本匹配所以初始化无问题。

具体触发细节

Logback 1.3.0的servlet-classic模块(若你的依赖包含它)会调用Servlet 4.0新增的API,比如ServletContext.getVirtualServerName()这类方法,但Jetty 9.4.x的Servlet 3.1环境中不存在这些方法。启动时其实会抛出NoSuchMethodError或ClassNotFoundException,只是这类异常被Logback的初始化逻辑吞掉,表面上看起来只是配置文件加载失败。

可行解决办法

  • 降级Logback版本:将Logback切换到1.2.x系列,该版本依赖Servlet 3.1.0,与Jetty 9.4.x完全兼容,无需调整其他依赖。
  • 升级Jetty版本:把Jetty升级到10.x及以上版本,这些版本支持Servlet 4.0+ API,能匹配Logback 1.3.0的依赖要求。
  • 排除Logback的Servlet依赖:如果你的应用不需要Logback与Servlet容器的集成功能(比如不通过Servlet上下文加载配置),可以在构建工具中排除Logback的javax.servlet依赖,强制使用Jetty提供的3.1.0版本。以Maven为例:
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-classic</artifactId>
    <version>1.3.0</version>
    <exclusions>
        <exclusion>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

注意:这种方式仅适用于不需要Logback与Servlet容器联动的场景,否则可能引发其他异常。

验证方法

启动Jetty时添加-verbose:class参数,查看Servlet相关类的加载来源,若显示从Jetty的jar包加载而非你的依赖包,即可确认版本冲突问题。同时检查应用日志目录或控制台,查看是否有被吞掉的初始化异常(可能需要调整JVM异常捕获配置才能显示)。

内容的提问来源于stack exchange,提问作者Shubham Goswami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:35:20