Tomcat 7.0.12 报错 org.apache.catalina.deploy.WebXml addFilter

本文解决了使用Tomcat7.0.52启动项目时遇到的XML资源解析错误及使用低版本Tomcat7.0.12时的web.xml解析问题。通过调整context.xml中的配置项解决了XML资源不可解析的问题,并通过添加<Loader delegate=true/>解决了web.xml解析错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天工作的时候从SVN新下载了一个项目,用的Tomcat 7.0.52 启动的,虽然项目能启动,但是有些页面报错:

java.io.FileNotFoundException: Could not resolve XML resource 
[null] with public ID [***] and base URI [null] to a known, local entity.

是因为 自从7.0.52版本后出于安全考虑将 xmlBlockExternal=”true”
官方解释:

As per discussion with Tomcat developers, xmlBlockExternal=”true” 
attribute of Tomcat’s Context (context.xml) was set true by default 
starting from 7.0.52. With xmlBlockExternal=”false” generated/djn-
settings.conf can be included` ontext  xmlBlockExternal="false">

可以将 Tomcat conf目录下的context.xml的 contex 节点上加上一个属性
xmlBlockExternal=”false”


然后我下载了一个低版本的 Tomcat 7.0.12 ,运行后又出现下面的错误,我将主要的信息截了出来:

2017-4-28 10:32:25 org.apache.tomcat.util.digester.Digester endElement
严重: End event threw exception
java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter
    at org.apache.tomcat.util.IntrospectionUtils.callMethod1(IntrospectionUtils.java:802)
    at org.apache.tomcat.util.digester.SetNextRule.end(SetNextRule.java:201)
    at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1057)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
.....
2017-4-28 10:32:25 org.apache.catalina.startup.ContextConfig parseWebXml
严重: Parse error in application web.xml file at jndi:/localhost/B-SDM/WEB-INF/web.xml
java.lang.NoSuchMethodException: org.apache.catalina.deploy.WebXml addFilter
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2687)
    at org.apache.tomcat.util.digester.Digester.createSAXException(Digester.java:2713)
    at org.apache.tomcat.util.digester.Digester.endElement(Digester.java:1060)
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanEndElement(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)
......
2017-4-28 10:32:25 org.apache.catalina.startup.ContextConfig parseWebXml
严重: Occurred at line 21 column 11
2017-4-28 10:32:25 org.apache.catalina.startup.ContextConfig configureStart
严重: Marking this application unavailable due to previous error(s)

这个错的解决方法是在Tomcat的 conf目录下的context.xml配置文件中的 Context 节点上加入 配置.

<Loader delegate="true" /> 

关于< Loader delegate=”true” /> 节点:

设置为 true,表示tomcat将遵循JVM的delegate机制,即一个WebAppClassLoader在加载类文件时,会先递交给SharedClassLoader加载,SharedClassLoader无法加载成功,会继续向自己的父类委托,一直到BootstarpClassLoader,如果都没有加载成功,则最后由WebAppClassLoader自己进行加载。
设置成 false,表示将不遵循这个delegate机制,即WebAppClassLoader在加载类文件时,会优先自己尝试加载,如果加载失败,才会沿着继承链,依次委托父类加载。
关于类加载的机制,将在稍后的博客中总结.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值