使用JUnit 4.10与Log4j2 2.10时遭遇ParserConfigurationException异常求助
这个ParserConfigurationException是Log4j2和Oracle自带XML解析器的兼容性冲突导致的——Log4j2在解析XML配置时会尝试禁用DTD处理,但Oracle的JXDocumentBuilderFactory不支持对应的XML特性,直接抛出了异常。下面是几个经过验证的解决办法:
强制使用标准Xerces解析器
给JVM添加启动参数,指定用Sun/Oracle的标准Xerces解析器替代Oracle的特定实现:-Djavax.xml.parsers.DocumentBuilderFactory=com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl -Djavax.xml.parsers.SAXParserFactory=com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl标准解析器支持Log4j2需要的DTD禁用特性,配置后就能正常解析
/scratch/log4j.xml了。移除Log4j2配置中的DTD声明
检查你的log4j.xml文件,如果顶部有类似<!DOCTYPE log4j:configuration ...>的DTD引用,直接删掉这一行。Log4j2的XML配置不需要依赖DTD,它使用Schema进行校验,移除DTD后解析器不会触发DTD加载流程,自然避开这个冲突。升级Log4j2到兼容版本
你当前使用的2.10版本比较老旧,后续的Log4j2版本(比如2.11及以上)对不同XML解析器的兼容性做了优化,已经修复了这类和Oracle解析器的冲突。建议升级到稳定的新版本(注意避开存在安全漏洞的版本,比如2.17.0之前的部分版本),升级后大概率能直接解决问题。
额外排查点:如果上述方案都没效果,检查你的项目类路径,确保没有同时存在多个XML解析器的Jar包(比如Oracle的xmlparserv2.jar和Xerces的Jar),类加载冲突也可能引发这类解析异常。
内容的提问来源于stack exchange,提问作者Vishnu

