更新Struts和Spring Jar后部署报错:NoClassDefFoundError: X509Certificate
问题描述
受困于该问题已有一段时间:WAR文件编译正常,类文件也存在,但应用无法运行并返回404错误。此问题始于我尝试更新Struts和Spring的.jar文件,这是我接手的一个老旧且严重过时的应用,我正试图提升其安全性,却卡在这个部署错误上,恳请各位提供解决方向。
错误日志
21-Oct-2022 14:39:18.916 SEVERE [localhost-startStop-42] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener] org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from ServletContext resource [/WEB-INF/applicationContext.xml]; nested exception is java.lang.NoClassDefFoundError: java/security/cert/X509Certificate at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336) at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217) at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:125) at org.springframework.web.context.support.XmlWebApplicationContext.loadBeanDefinitions(XmlWebApplicationContext.java:94) at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:126) at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:614) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:443) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:325) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4689) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5155) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:743) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:719) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:970) at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1840) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:750) Caused by: java.lang.NoClassDefFoundError: java/security/cert/X509Certificate
解决方向
- 检查JDK版本兼容性:
java/security/cert/X509Certificate是JDK核心类,出现找不到的情况大概率是版本不匹配。确认更新后的Spring/Struts版本的最低JDK要求(比如Spring 5.x需JDK 8+,Spring 4.x需JDK 6+),同时保证编译WAR的JDK与Tomcat运行的JDK版本一致,避免跨版本编译导致类加载异常。 - 清理依赖冲突:删除
WEB-INF/lib目录下旧版本的Spring、Struts相关jar,只保留新版本依赖。同时检查是否遗漏了新版本Spring所需的安全相关依赖,若配置了证书相关Bean,需确保对应依赖jar存在。 - 清理Tomcat缓存:删除Tomcat的
work和temp目录下所有文件,重新部署WAR包,避免旧类缓存干扰新应用加载。 - 排查XML配置问题:新版本Spring可能不再支持旧XML配置标签,检查
applicationContext.xml中是否有引用X509Certificate或相关安全类的配置,替换为新版本兼容的写法。可尝试逐步注释部分Bean配置,定位触发错误的具体配置项。
内容的提问来源于stack exchange,提问作者ddoublea
相关产品推荐
相关产品推荐

