编译时VS运行时

时间:2013-05-20 19:31:07

标签: java class jar collision

我遇到了麻烦,我有一个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获取类...

1 个答案:

答案 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()并返回错误的一个。