请注意:虽然有几个问题可以粘贴到类似的例外&堆栈跟踪,这个问题肯定是而不是他们中的任何一个,因为我试图理解我的类加载出错的地方。
嗨,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并从命令行运行它,我就不会遇到此异常。