今天工作的时候从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在加载类文件时,会优先自己尝试加载,如果加载失败,才会沿着继承链,依次委托父类加载。
关于类加载的机制,将在稍后的博客中总结.