如何禁用访问外部 DTD 和实体扩展限制警告与日志返回

2022-09-01 11:00:07

我正在使用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 中?我尝试使用过滤器编写过滤器,但没有帮助。


答案 1

这是 JRE 中的一个已知 bug,它将此报告为警告。在此处此处查看错误报告

仅当类路径中有 xerces jar 时,才会发生此问题,xerces 实现无法识别该属性,并在 org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.setProperty() 上引发异常,从而导致来自 com.sun.org.apache.xalan.internal.xsltc.compiler.Parser.parse() 的警告日志(到 System.err)

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

您的日志过滤器不起作用,因为错误永远不会发送到slf4j。哪种类型建议一种复杂的方法来解决问题 - 将System.err重定向到slf4j,然后对其使用日志记录过滤器。

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

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

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="/">
        <!-- TODO: Auto-generated template -->
    </xsl:template>
</xsl:stylesheet>

和 maven 依赖性:

<dependency>
    <groupId>xerces</groupId>
    <artifactId>xercesImpl</artifactId>
    <version>2.11.0</version>
</dependency>

答案 2

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

因为我有一个包含在 war 文件中的下游依赖项,所以我的解决方案是使用下面的代码来拖动它,让 xerces 的 JRE 实现在类路径中接管。xercesImpl.jarbuild.gradle

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

推荐