升级Tomcat 8.5与Spring 5.1后Web.xml配置失效,OSGi应用报错
问题分析与解决方案
核心原因定位
Tomcat 8.5.x对类加载机制做了针对性调整,尤其是和OSGi环境的类隔离交互逻辑。Spring 5.1.x依赖的commons-logging在初始化时会尝试读取commons-logging.properties配置文件,而Tomcat 8.5的类加载器在OSGi场景下无法正确处理这种资源加载流程,最终触发空指针异常。
具体解决方案
- 显式添加commons-logging配置文件:在项目的
src/main/resources目录下创建commons-logging.properties,哪怕是空文件也能避免加载时的空指针。也可以直接指定日志实现类,示例内容:org.apache.commons.logging.Log=org.apache.commons.logging.impl.Jdk14Logger - 替换commons-logging为spring-jcl(推荐):Spring 5.x原生支持用
spring-jcl替代commons-logging,先排除Spring依赖中的commons-logging,再引入spring-jcl:<!-- Maven依赖配置 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.1.20.RELEASE</version> <exclusions> <exclusion> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jcl</artifactId> <version>5.1.20.RELEASE</version> </dependency> - 调整Tomcat类加载配置:在Tomcat的
conf/catalina.properties中,将org.apache.catalina.loader.WebappClassLoader.ENABLE_CLEAR_REFERENCES设为false,或者修改common.loader参数让commons-logging相关资源能被正确加载,但这种方式可能削弱类隔离性,需谨慎使用。 - 修正OSGi Bundle的类导入配置:确保
MANIFEST.MF中正确导入Spring和日志相关包,避免类加载器冲突,示例配置:Import-Package: org.springframework.web.context, org.apache.commons.logging;version="[1.2,2)"
验证步骤
- 应用任一方案后启动Tomcat 8.5.87
- 检查启动日志,确认空指针异常消失
- 验证OSGi应用的监听器、过滤器及核心业务功能正常运行
内容的提问来源于stack exchange,提问作者jn0826
相关产品推荐
相关产品推荐

