【问题标题】:Tomcat apps fail to deploy with STRICT_SERVLET_COMPLIANCE=trueTomcat 应用程序无法部署 STRICT_SERVLET_COMPLIANCE=true
【发布时间】:2017-02-14 05:18:07
【问题描述】:

我正在尝试通过更新 apache-tomcat-8.0.39\conf\catalina.properties 在 Tomcat 8.0.39 上使用选项 STRICT_SERVLET_COMPLIANCE=true 部署应用程序,但是一旦我这样做,我的应用程序部署就会失败。 即我开始收到错误: 严重 [localhost-startStop-1] org.apache.tomcat.util.digester.Digester.error 应用程序 web.xml 文件中所有标签的解析错误。

其中一个堆栈跟踪如下:

09-Feb-2017 15:06:32.189 SEVERE [localhost-startStop-1] org.apache.tomcat.util.digester.Digester.error 第 5 行第 66 列解析错误:文档根元素“web-app” , 必须匹配 DOCTYPE 根“xml”。 org.xml.sax.SAXParseException; systemId:file:/C:/Servers/Tomcat%208/apache-tomcat-8.0.39/webapps/file-service/WEB-INF/web.xml;行号:5;列号:66;文档根元素“web-app”,必须匹配 DOCTYPE 根“xml”。 在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(未知来源) 在 com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(未知来源) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.rootElementSpecified(未知来源) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.handleStartElement(未知来源) 在 com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator.startElement(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDriver.scanRootElementHook(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(未知来源) 在 com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(未知来源) 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(未知来源) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(未知来源) 在 org.apache.tomcat.util.digester.Digester.parse(Digester.java:1448) 在 org.apache.tomcat.util.descriptor.web.WebXmlParser.parseWebXml(WebXmlParser.java:119) 在 org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1119) 在 org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:783) 在 org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:307) 在 org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:95) 在 org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5213) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408) 在 org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398) 在 java.util.concurrent.FutureTask.run(未知来源) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(未知来源) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(未知来源) 在 java.lang.Thread.run(Unknown Source)

为了解决这个问题,我尝试了以下选项:

1) 在 catalina.properties 中添加以下内容:

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true
org.apache.tomcat.util.http.ServerCookie.FWD_SLASH_IS_SEPARATOR=false

2) 更新代理 WAR web.xml 文件 用 web-app_2_5.xsd 更新了 web-app_3_0.xsd 将 version="3.0" 更新为 version="2.5"

我还尝试将“web-app”标签条目从 apache-tomcat-8.0.39\conf\web.xml 复制到我的应用程序 web.xml,但没有用。

3) 尝试将以下值设置为各自的默认值 [as setting

org.apache.catalina.STRICT_SERVLET_COMPLIANCE=true changes these defaults]
org.apache.catalina.core.ApplicationContext.GET_RESOURCE_REQUIRE_SLASH
org.apache.catalina.core.ApplicationDispatcher.WRAP_SAME_OBJECT
org.apache.catalina.core.StandardHostValve.ACCESS_SESSION
org.apache.catalina.session.StandardSession.ACTIVITY_CHECK
org.apache.catalina.session.StandardSession.LAST_ACCESS_AT_START
org.apache.tomcat.util.http.ServerCookie.STRICT_NAMING

The **URIEncoding** attribute of any HTTP connector or AJP connector element.
The **resourceOnlyServlets** attribute of any Context element.
The **tldValidation** attribute of any Context element.
The **useRelativeRedirects** attribute of any Context element.
The **xmlNamespaceAware** attribute of any Context element.
The **xmlValidation** attribute of any Context element.

但似乎没有任何工作正常。我也无法导航到 tomcat 管理器或部署的任何其他应用程序。

另一方面,当我在 catalina.properties 中编写 STRICT_SERVLET_COMPLIANCE=false 时,一切正常

这里有什么我遗漏的吗?请帮我解决这个问题。

问候, 布佩什

【问题讨论】:

    标签: java apache tomcat tomcat8


    【解决方案1】:

    我也遇到了这个问题。我们工作的环境要求将 STRICT_SERVLET_COMPLIANCE 设置为 true,但 web.xml 的验证并不是要求背后的驱动力。要解决此问题,请尝试在 conf/context.xml 的标签中将 xmlValidation 设置为 false:

    <Context xmlValidation="false"> ... </Context>
    

    【讨论】:

    • 我不确定我是如何错过回答我的这个问题的,但是是的,我们很久以前就使用您提到的选项解决了这个问题。感谢您的回复。
    猜你喜欢
    • 2013-05-14
    • 2012-12-01
    • 2013-11-03
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    相关资源
    最近更新 更多