全网首发:跟踪分析This parser does not support specification “null“ version “null“

Posted 柳鲲鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了全网首发:跟踪分析This parser does not support specification “null“ version “null“相关的知识,希望对你有一定的参考价值。

  详细错误:

Caused by: java.lang.UnsupportedOperationException: This parser does not support specification "null" version "null"
	at javax.xml.parsers.SAXParserFactory.setSchema(SAXParserFactory.java:394)
	at net.loomchild.segment.srx.io.Srx2SaxParser.<init>(Srx2SaxParser.java:181)
	at org.languagetool.tokenizers.SrxTools.createSrxDocument(SrxTools.java:52)
	at org.languagetool.tokenizers.SRXSentenceTokenizer.<init>(SRXSentenceTokenizer.java:53)
	at org.languagetool.tokenizers.SimpleSentenceTokenizer.<init>(SimpleSentenceTokenizer.java:38)
	at org.languagetool.Language.<clinit>(Language.java:66)
	... 47 more

  分析如下:

  • 查了一下,说是跟xerces.jar有关。吾搜索了一下工程,并无此文件。
  • 单独运行LanguageToolTest是对的。
  • 整合到泰山OFFICE就错误了。

  那么就是泰山OFFICE的某个包冲突了?吾随后把包复制到LanguageToolTest进行排查。一次5个,几次就定位到了。是一个pull-parser-2.jar导致的。将此文件删除,功能正常。

  这事不能就这么结束了。为什么加个包就错了呢?于是通过源码跟踪,发现不同情形下,产生的SAXParserFactory不一样(这也是理所当然的):

错误 org.gjt.xpp.jaxp11.SAXParserFactoryImpl@2328c243
正确 com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl@6659c656
{http://xml.org/sax/features/namespaces=true, http://xml.org/sax/features/validation=false}
true
com.sun.org.apache.xerces.internal.jaxp.validation.SimpleXMLSchema@6d5380c2
false

  产生SAXParserFactory的代码是:

	public Srx2SaxParser(Map<String, Object> parameterMap) {
		factory = SAXParserFactory.newInstance();
	}

    public static SAXParserFactory newInstance() {
        return FactoryFinder.find(
                /* The default property name according to the JAXP spec */
                SAXParserFactory.class,
                /* The fallback implementation class name */
                "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
    }

static <T> T find(Class<T> type, String fallbackClassName)
        throws FactoryConfigurationError
{
        T provider = findServiceProvider(type);
        if (provider != null) {
            return provider;
        }
}

  到了这里其实就明白了:优先搜索jar包中是否有SAXParserFactory的类,如果有就使用;否则使用默认的。

  原因找到了。怎么解决呢?首先修改JDK肯定不行。所以:

  • 办法一:去掉有问题的包。这个想法是好的,现实则有可能实现不了。
  • 办法二:在相关代码中直接指定工厂。具体代码:
    SAXParserFactory factory = SAXParserFactory.newInstance();
	try
	{
		Class<?> clazz = Class.forName("com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl");
		factory = (SAXParserFactory)clazz.newInstance();
	}
	catch (Exception e)
	{
		e.printStackTrace();
	}

 

以上是关于全网首发:跟踪分析This parser does not support specification “null“ version “null“的主要内容,如果未能解决你的问题,请参考以下文章

全网首发:JDK绘制文字:八绘制函数简要分析

全网首发:JDK绘制文字:八绘制函数简要分析

全网首发:j3d/jogl多个崩溃分析总结

全网首发:ScrollBarUI混淆后效果错误的分析

全网首发:C#中Form设置$this.Icon,任务栏图标错误的解决办法(bitmap转icon)

全网首发:There is an incompatible JNA native library installed on this system/6.1.2/4.0.1