Eclipse XML Parser“Providers”与rt.jar冲突

时间:2015-07-10 14:42:49

标签: java xml-parsing classpath jaxp rt.jar

请注意:虽然有几个问题可以粘贴到类似的例外&堆栈跟踪,这个问题肯定是而不是他们中的任何一个,因为我试图理解我的类加载出错的地方。

嗨,Java 8 / Groovy 2.4.3 / Eclipse Luna在这里。我正在使用BigIP iControl Java client(用于以编程方式控制强大的负载均衡器),而后者又使用Apache Axis 1.4。在使用Axis 1.4时,我得到了以下stacktrace(来自Eclipse控制台):

Caught: javax.xml.parsers.FactoryConfigurationError: Provider for javax.xml.parsers.DocumentBuilderFactory cannot be found
javax.xml.parsers.FactoryConfigurationError: Provider for javax.xml.parsers.DocumentBuilderFactory cannot be found
    at org.apache.axis.utils.XMLUtils.getDOMFactory(XMLUtils.java:221)
    at org.apache.axis.utils.XMLUtils.<clinit>(XMLUtils.java:83)
    at org.apache.axis.configuration.FileProvider.configureEngine(FileProvider.java:179)
    at org.apache.axis.AxisEngine.init(AxisEngine.java:172)
    at org.apache.axis.AxisEngine.<init>(AxisEngine.java:156)
    at org.apache.axis.client.AxisClient.<init>(AxisClient.java:52)
    at org.apache.axis.client.Service.getAxisClient(Service.java:104)
    at org.apache.axis.client.Service.<init>(Service.java:113)
    at iControl.LocalLBPoolLocator.<init>(LocalLBPoolLocator.java:21)
    at iControl.Interfaces.getLocalLBPool(Interfaces.java:351)
    at com.me.myapp.F5Client.run(F5Client.groovy:27)

嗯,让我们来看看XMLUtils.getDOMFactory方法:

private static DocumentBuilderFactory getDOMFactory() {
    DocumentBuilderFactory dbf;
    try {
        dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
    }
    catch( Exception e ) {
        log.error(Messages.getMessage("exception00"), e );
        dbf = null;
    }
    return( dbf );
}

好的,LN 221是对DocumentBuilderFactory.newInstance()的来电,所以让我们来看看它:

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

情节变浓!现在让我们来看看FactoryFinder.find

static <T> T find(Class<T> type, String fallbackClassName)
        throws FactoryConfigurationError
{
    final String factoryId = type.getName();
    dPrint("find factoryId =" + factoryId);

    // lots of nasty cruft omitted for brevity...


    // Try Jar Service Provider Mechanism
    T provider = findServiceProvider(type);
    if (provider != null) {
        return provider;
    }
    if (fallbackClassName == null) {
        throw new FactoryConfigurationError(
            "Provider for " + factoryId + " cannot be found");      // <<-- Ahh, here we go
    }

    dPrint("loaded from fallback value: " + fallbackClassName);
    return newInstance(type, fallbackClassName, null, true);
}

因此,如果我正在解释这个权利,它会抛出FactoryConfigurationError,因为它无法找到主“提供者类”(无论这意味着什么)并且没有指定回退。但不是吗?!?对FactoryFinder.find的调用包含非null "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"字符串参数。这让我怀疑我的类路径真的很糟糕,而且我的代码中的某个地方有一个流氓DocumentBuilderFactory不是rt.jar/javax/xml/parsers中定义的那个)这个finder方法的NULL参数。

但这也没有意义,因为Axis 1.4没有出现(至少根据Maven回购)有任何依赖...这意味着javax.xml.*的唯一“提供者”将是rt.jar。除非,Eclipse可能会以某种方式解决问题?我很困惑,请帮忙: - /

更新

这绝对是一个Eclipse问题。如果我将我的应用程序打包为可执行JAR并从命令行运行它,我就不会遇到此异常。

0 个答案:

没有答案