Java 编译时与运行时

Java 编译时与运行时,java,class,jar,collision,Java,Class,Jar,Collision,我遇到了一个问题,我有一个jar,一个合作伙伴创建来读取实现一些wsdl处理的Web服务,这是在netbeans中创建的 所以我想使用这个jar,当我使用它时,我得到一个NoClassDefFoundError,我想这是因为有一些库冲突,所以从堆栈跟踪来看: NoClassDefFoundError org.codehaus.xfire.jaxws.JAXWSHelper [...] org.codehaus.xfire.jaxws.Provider.createServiceDelegate(

我遇到了一个问题,我有一个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)
NoClassDefFoundError org.codehaus.xfire.jaxws.JAXWSHelper
[...]
org.codehaus.xfire.jaxws.Provider.createServiceDelegate(Provider.java:32)
java.xml.ws.Service.(Service.java:56)
org.ubl.soap.test.SubmissionAPI(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来自我在项目中使用的两个jar,一个是axis2,另一个是jaxws-api.jar

我想到的第一件事是,如果它是从axis2而不是从jaxws-api.jar中获取的类,那么axis2中的类可能不工作,因为它们比较旧,所以如果我想使用来自jaxws-api.jar的类而不是axis2中的类,我应该怎么做

在类路径中,定义了这两个类,因此在不同的JAR中定义了sames类,但是名称空间是相同的,我不能仅仅删除axis2,因为系统正在使用其中的一些


因此,我知道错误NodeFoundClass是一个运行时错误,因此它可能是正确构建的,但在运行时是从xfire而不是axis2获取类…

如果您查看
提供程序的javadoc
类:

上面写着:

如果存在名为META-INF/services/javax.xml.ws.spi.Provider的资源,则其第一行(如果存在)将用作实现类的UTF-8编码名称

因此,创建该文件并将要使用的提供者的名称放入其中


问题是您调用了
Provider.Provider()
,它返回了错误的一个。

它调用的
noclasdefounderror
不是
nodefoundclass
。也请张贴例外的顶部。问题是没有找到某个类。当您通过类的FQN来寻址类时,您编写的问题不应该发生,因此,
javax.xml.ws.Provider
不应该作为
org.codehaus.xfire.jaxws.Provider
来寻址,对不起,您的权利,顶部是java.lang.NoClassDefFoundError:无法初始化类org.codehaus.xfire.jaxws.JAXWSHelper问题是不应该使用org.codehaus.xfire.jaxws.JAXWSHelper,问题是不应该使用整个库,注意,我使用的是jaxws.xml.ws中的类,而不是org.codehaus.xfire中的类……我意识到javax.xml.ws下的Provider类是一个接口,所以在运行时,当它搜索Provider类的实现时,它找到的是org.codehaus.xfire中的一个,但我想知道的是,如果我从netbeans运行它,它是如何工作的。@user2391243您必须查看源代码以查看实际要调用的类。是的,我查看了,失败的行是:delegate=Provider.Provider().createServiceDelegate(wsdlDocumentLocation,serviceName,this.getClass());并引用了类javax.xml.ws.spi.Provider.java,该类看起来是一个抽象类。但出于某种原因,它需要org.codehaus.xfire.jaxws.Provider.createServiceDelegate