使用cxf调用webservice接口异常 : com/sun/tools/internal/xjc/api/XJC
本机idea启动服务不会出错,但是部署到服务器上后调用接口就会出现如下错误:
Caused by: javax.xml.bind.JAXBException
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:715) ~[cxf-core-3.4.3.jar!/:3.4.3]
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:722) ~[cxf-core-3.4.3.jar!/:3.4.3]
... 79 more
Caused by: java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
at java.lang.Class.forName0(Native Method) ~[?:1.8.0_181]
at java.lang.Class.forName(Class.java:348) ~[?:1.8.0_181]
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:708) ~[cxf-core-3.4.3.jar!/:3.4.3]
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:722) ~[cxf-core-3.4.3.jar!/:3.4.3]
... 79 more
分析:
说明不是项目本身的问题,应该从java环境去分析。本地启动是使用的jdk运行的,而服务器是使用的jre运行的,这个错误表达的就是缺少依赖com/sun/tools/internal/xjc/api/XJC类,而这个类恰好再tools.jar中,通过排查发下服务器上的jre/lib目录下并没有这个jar包
解决方案:
将服务器上与jre同级的jdk/lib目录下的tools.jar拷贝到jre/lib目录下,然后重启项目即可。如果服务器上没有jdk,那么可将本地jdk中的tools.jar上传到服务器使用。