Tomcat8 org.apache.cxf.BusFactory.getBusFactoryClass 无法确定 BusFactory 实现 class 名称
Tomcat8 org.apache.cxf.BusFactory.getBusFactoryClass Failed to determine BusFactory implementation class name
我已经通过 Arquillian (1.1.12.Final) 将应用程序部署到 Tomcat 8.5.11,其中查询了一个 webervice。该应用程序将 Apache CXF 3.1.10 作为提供的依赖项;所有 cxf 和 spring JAR 都已添加到 Tomcat 上的 endorsed
库目录(我已验证所有认可的 JAR 已正确加载)。
尽管如此,我还是遇到了上述错误消息。堆栈跟踪的相关位是
java.lang.NullPointerException
at org.apache.cxf.BusFactory.getBusFactoryClass(BusFactory.java:397)
at org.apache.cxf.BusFactory.newInstance(BusFactory.java:317)
at org.apache.cxf.BusFactory.newInstance(BusFactory.java:304)
at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:107)
at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:244)
at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:228)
at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:135)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:129)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82)
at javax.xml.ws.Service.<init>(Service.java:77)
[剪断]
java.lang.NullPointerException
at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:166)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:160)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:107)
at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:178)
at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:185)
at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:40)
at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:36)
at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:32)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:146)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:122)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:94)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:83)
at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:107)
at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:244)
at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:228)
at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:135)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:129)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82)
at javax.xml.ws.Service.<init>(Service.java:77)
NPE发生在web服务的初始化过程中。失败的代码是
// org.apache.cxf.bus.extension.ExtensionManagerImpl
final void load(String resource) throws IOException {
if (loader != getClass().getClassLoader()) {
load(resource, getClass().getClassLoader());
}
load(resource, loader);
}
原来调用getClass().getClassLooader()
returnsnull
。我对这个结果感到困惑,只是为了找出 getClass().getClassLoader() is null, why? 这对我来说仍然没有意义,因为我认为这意味着 CXF 是使用引导类路径 (!?!).
加载的
问题是由于将 CXF jar 放在 $CATALINA_HOME/endoresed
中引起的。这是放置所有 web 应用程序通用的 jar 的错误位置。如 "XML Parsers and Java" 部分的 http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 所述。
我已经通过 Arquillian (1.1.12.Final) 将应用程序部署到 Tomcat 8.5.11,其中查询了一个 webervice。该应用程序将 Apache CXF 3.1.10 作为提供的依赖项;所有 cxf 和 spring JAR 都已添加到 Tomcat 上的 endorsed
库目录(我已验证所有认可的 JAR 已正确加载)。
尽管如此,我还是遇到了上述错误消息。堆栈跟踪的相关位是
java.lang.NullPointerException
at org.apache.cxf.BusFactory.getBusFactoryClass(BusFactory.java:397)
at org.apache.cxf.BusFactory.newInstance(BusFactory.java:317)
at org.apache.cxf.BusFactory.newInstance(BusFactory.java:304)
at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:107)
at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:244)
at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:228)
at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:135)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:129)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82)
at javax.xml.ws.Service.<init>(Service.java:77)
[剪断]
java.lang.NullPointerException
at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:166)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:160)
at org.apache.cxf.bus.extension.ExtensionManagerImpl.load(ExtensionManagerImpl.java:107)
at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:178)
at org.apache.cxf.bus.extension.ExtensionManagerBus.<init>(ExtensionManagerBus.java:185)
at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:40)
at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:36)
at org.apache.cxf.bus.CXFBusFactory.createBus(CXFBusFactory.java:32)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:146)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:122)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:94)
at org.apache.cxf.bus.spring.SpringBusFactory.createBus(SpringBusFactory.java:83)
at org.apache.cxf.BusFactory.getDefaultBus(BusFactory.java:107)
at org.apache.cxf.BusFactory.createThreadBus(BusFactory.java:244)
at org.apache.cxf.BusFactory.getThreadDefaultBus(BusFactory.java:228)
at org.apache.cxf.jaxws.ServiceImpl.initialize(ServiceImpl.java:135)
at org.apache.cxf.jaxws.ServiceImpl.<init>(ServiceImpl.java:129)
at org.apache.cxf.jaxws.spi.ProviderImpl.createServiceDelegate(ProviderImpl.java:82)
at javax.xml.ws.Service.<init>(Service.java:77)
NPE发生在web服务的初始化过程中。失败的代码是
// org.apache.cxf.bus.extension.ExtensionManagerImpl
final void load(String resource) throws IOException {
if (loader != getClass().getClassLoader()) {
load(resource, getClass().getClassLoader());
}
load(resource, loader);
}
原来调用getClass().getClassLooader()
returnsnull
。我对这个结果感到困惑,只是为了找出 getClass().getClassLoader() is null, why? 这对我来说仍然没有意义,因为我认为这意味着 CXF 是使用引导类路径 (!?!).
问题是由于将 CXF jar 放在 $CATALINA_HOME/endoresed
中引起的。这是放置所有 web 应用程序通用的 jar 的错误位置。如 "XML Parsers and Java" 部分的 http://tomcat.apache.org/tomcat-7.0-doc/class-loader-howto.html 所述。