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

升级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)"
    

验证步骤

  1. 应用任一方案后启动Tomcat 8.5.87
  2. 检查启动日志,确认空指针异常消失
  3. 验证OSGi应用的监听器、过滤器及核心业务功能正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 02:22:07