如何使用logback禁用accessExternalDTD和entityExpansionLimit警告

我正在使用groovy的logback并在解析xml时出现很多警告。 我知道JDK1.7_u45中导致此问题的错误。

Warning: org.apache.xerces.parsers.SAXParser: Property 'http://javax.xml.XMLConstants/property/accessExternalDTD' is not recognized. Warning: org.apache.xerces.parsers.SAXParser: Property 'http://www.oracle.com/xml/jaxp/properties/entityExpansionLimit' is not recognized. 

有没有办法关闭这个日志警告出现在DEBUG? 我尝试使用Filter编写filter,但没有帮助。

这是JRE中的一个已知错误,它将此报告为警告。 请参阅此处和此处的错误报告

只有在类路径中有xerces jar时才会出现问题,xerces实现无法识别该属性并在org.apache.xerces.jaxp.SAXParserImpl $ JAXPSAXParser.setProperty()上抛出exception,从而产生警告日志(对系统.err)来自com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.parse()

简单(如果可能)解决方案是从类路径中删除xerces jar。

您的日志filter不起作用,因为错误永远不会发送到slf4j。 哪种方式表明解决问题的复杂方法 – 将System.err重定向到slf4j ,然后对其使用日志记录filter。

用于重现问题的示例代码(基于问题报告):

 import java.io.IOException; import java.net.URL; import javax.xml.transform.TransformerConfigurationException; import javax.xml.transform.TransformerFactory; import javax.xml.transform.stream.StreamSource; public class XercesTest { public static void main(String[] args) throws IOException, TransformerConfigurationException { TransformerFactory tf = TransformerFactory.newInstance(); URL xsl = MainClass.class.getResource("build.xsl"); StreamSource stylesheetSource = new StreamSource( xsl.openStream(), xsl.toExternalForm()); tf.newTransformer(stylesheetSource); } } 

build.xsl

       

和maven依赖:

  xerces xercesImpl 2.11.0  

我在项目中也遇到了这个错误。 据我了解,新版本的JRE内置了Xerces实现。 更重要的是,JRE版本正确支持accessExternalDTDentityExpansionLimit属性。

因为我的xercesImpl.jar文件中有一个包含xercesImpl.jar的下游依赖项,我的解决方案就是在build.gradle使用下面的代码将其build.gradle让xerces的JRE实现接管类路径。

 warApplication { from '/WEB-INF/lib' exclude 'xercesImpl*.jar' }