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

Jersey 1.19与log4j2在Tomcat7下兼容问题:Servlet启动失败

解决Tomcat7下Jersey 1.19与Log4j2协同的Servlet启动失败问题

首先,你的核心问题大概率是依赖冲突或者桥接包配置逻辑错误,结合你的描述,我整理了几个关键排查和修复步骤:

1. 修正Log4j2桥接包的配置逻辑

你当前的依赖中同时存在slf4j-log4j12(SLF4J绑定到Log4j1的桥接)和Log4j2的包,这会让SLF4J陷入“该绑定哪个日志实现”的冲突。正确的配置分两种场景:

场景A:代码仅使用SLF4J API(无直接调用Log4j1的代码)

移除slf4j-log4j12,替换为Log4j2官方提供的SLF4J绑定包log4j-slf4j-impl,同时升级SLF4J API到与Log4j2兼容的版本(至少1.7.x,1.7.36适配Log4j2.11.0是不错的选择),最终依赖如下:

<dependencies>
    <!-- 统一SLF4J API版本 -->
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.36</version>
    </dependency>
    <!-- Log4j2核心依赖 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-api</artifactId>
        <version>2.11.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.11.0</version>
    </dependency>
    <!-- SLF4J绑定到Log4j2的桥接包 -->
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-slf4j-impl</artifactId>
        <version>2.11.0</version>
    </dependency>
</dependencies>

场景B:代码直接调用了Log4j1的API(比如org.apache.log4j.Logger)

除了上述配置外,还需要保留log4j-1.2-api来桥接旧的Log4j1调用到Log4j2:

<!-- 桥接Log4j1 API到Log4j2,兼容旧代码 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-1.2-api</artifactId>
    <version>2.11.0</version>
</dependency>

2. 排除Jersey依赖中的冲突日志包

Jersey 1.19可能会间接引入旧版本的SLF4J或Log4j1依赖,导致版本冲突。你需要在Jersey的依赖中主动排除这些冲突包:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.19</version>
    <exclusions>
        <!-- 排除Jersey自带的SLF4J API,使用我们统一的版本 -->
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
        </exclusion>
        <!-- 排除可能引入的Log4j1依赖 -->
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 检查Tomcat全局依赖冲突

Tomcat 7的lib目录中如果存在旧的log4j.jar、slf4j-api.jar或相关桥接包,会优先于你的项目依赖加载,导致冲突。请:

  • 进入Tomcat的$CATALINA_HOME/lib目录,检查是否存在上述日志相关jar包
  • 如果有,将它们移除(若其他项目依赖这些包,建议将项目改为使用Tomcat共享库,或升级全局日志包版本)

4. 验证依赖树

使用Maven命令查看完整的依赖树,确认没有残留的Log4j1或冲突的SLF4J版本:

mvn dependency:tree | grep -E "(slf4j|log4j)"

确保输出中只有你配置的Log4j2相关包和指定版本的SLF4J API。

5. 定位具体启动异常

如果上述步骤仍未解决问题,查看Tomcat的localhost.log或项目日志,找到Servlet启动失败的具体异常:

  • 若为NoSuchMethodError,基本是SLF4J版本冲突导致的API不兼容
  • 若为ClassNotFoundException,可能是某个日志包缺失或被意外排除

按照这个流程排查,应该能解决Jersey与Log4j2的协同问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:54:40