我遇到了麻烦,我有一个jar,创建了一个伙伴,用于从实现某些wsdl处理的web服务中读取,这是在netbeans中创建的。
所以我想使用这个jar,当我使用它时,我得到一个NoClassDefFoundError
,我认为它发生是因为有一些库的冲突,所以从堆栈跟踪中看一下:
NoClassDefFoundError org.codehaus.xfire.jaxws.JAXWSHelper
[...]
org.codehaus.xfire.jaxws.Provider.createServiceDelegate(Provider.java:32)
javax.xml.ws.Service.<init>(Service.java:56)
org.ubl.soap.test.SubmissionAPI.<init>(SubmissionAPI.java:44)
我正在使用javax.xml.ws
中的库,因此它使用Service.java
,因此在该类中,它使用类javax.xml.ws.Provider
,但由于某种原因,它需要使用相同的类来自org.codehaus.xfire.jaxws
的其他图书馆。
org.codehaus.xfire.jaxws
来自xfire.jar,javax.xml.ws来自我在项目中使用的两个罐子,一个是axis2,另一个是jaxws-api.jar。
我想到的第一件事是,如果它从axis2而不是jaxws-api.jar中获取类,那么也许axis2中的类不能正常工作,因此如果我想使用jaxws中的类 - api.jar而不是axis2中的那个我该怎么办?
在类路径中,定义了两个,因此在不同的jar中定义了相同的类,但命名空间是相同的,我不能只删除axis2因为系统正在使用它。 ..
所以我知道错误NoDefFoundClass是一个运行时错误,所以也许它是正确构建的,但是在运行时从xfire而不是axis2获取类...
答案 0 :(得分:1)
如果您查看Provider
课程的javadoc:http://docs.oracle.com/javase/6/docs/api/javax/xml/ws/spi/Provider.html#provider()
它说:
如果存在名称为META-INF / services / javax.xml.ws.spi.Provider的资源,则其第一行(如果存在)将用作实现类的UTF-8编码名称。
因此,创建该文件并将要使用的Provider的名称放入其中。
问题是你拨打Provider.provider()
并返回错误的一个。