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
相关产品推荐
相关产品推荐

