环境:WebSphere 6.l
JRE: WebSphere 6.1 JRE
项目需求:用SUN JDK6自带的JAX-WS创建Web Service。 其中Server端的Web Service接口已发布,我这边的项目直接根据对方提供的WSDL创建Client。
碰到的问题:
当调用javax.xml.ws.Service的构造方法 Service(URL url, QName qName)的时候,报错如下:
[3/14/09 14:51:53:750 CST] 0000002c SystemErr R Caused by: java.lang.Throwable: java.lang.LinkageError: You are loading old SAAJ from jar:file:/C:/Program%20Files/IBM/SDP70/runtimes/base_v61/lib/j2ee.jar!/javax/xml/soap/MessageFactory.class
at com.sun.xml.ws.api.SOAPVersion.<init>(SOAPVersion.java:184)
at com.sun.xml.ws.api.SOAPVersion.<clinit>(SOAPVersion.java:83)
at java.lang.J9VMInternals.initializeImpl(Native Method)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:177)
at com.sun.xml.ws.api.BindingID.<clinit>(BindingID.java:318)
...(以下省略300字)
Caused by: java.lang.Throwable: java.lang.NoSuchMethodError: javax/xml/soap/MessageFactory.newInstance(Ljava/lang/String;)Ljavax/xml/soap/MessageFactory;
at com.sun.xml.ws.api.SOAPVersion.<init>(SOAPVersion.java:178)
... 21 more
也就是说,程序先去读取了WebSphere 6.1的j2ee.jar包里的相关类,而没去读取我们真正要用的两个SAAJ jar包:saaj-api.jar和saaj-impl.jar. 结果就出错了。
IBM上找到的原因及解决办法:
主要就是把Classloader mode从默认的Parent_First改成Parent_Last,让程序先读自己的class文件以及jar包。
我就照样画葫芦设置了。顺便说一下,关联共享库到应用程序,我无论如何都做不成功。关闭Application,进入Application,关联共享库,关联好了,保存成功,退到外面,再进去,共享库又没关联上。设置Classloader mode的时候也遇到了这样的问题,但最终还是迫使其让我保存了。共享库就不管理,反正无所谓,只要加载顺序变了就成。
但事实上,我的担心成为了事实:程序启动失败,虽然起来了,但只跑了一小部分代码,后面的服务都没起来。想想也是,程序那么大,用到的jar包那么多,改了Classloader mode,一切全都乱套了...
之后,查看Console-->TroubleShooting-->Class Loader View,发现系统最开始加载的是WebSphere下的ext目录下的jar包
、
所以就投机取巧,把我要用的两个saaj包放到了ext目录下,重启,程序运行成功
当然,这不是一个好的解决办法,阿三那里能不能通得过还是个问题
posted on 2009-03-14 20:26
EvanLiu 阅读(6305)
评论(1) 编辑 收藏 所属分类:
Java基础