现象
使用 JaxWsDynamicClientFactory调用接口,idea本地可以调用成功。部署到服务器报错:
ERROR o.a.c.c.C.[.[localhost].[/].[dispatcherServlet] - Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: Unable to create schema compiler] with root cause
java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompiler(JAXBUtils.java:718)
at org.apache.cxf.common.jaxb.JAXBUtils.createSchemaCompilerWithDefaultAllocator(JAXBUtils.java:732)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createSchemaCompiler(DynamicClientFactory.java:445)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:325)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:243)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:236)
at org.apache.cxf.endpoint.dynamic.DynamicClientFactory.createClient(DynamicClientFactory.java:191)
分析
参考 https://bbs.csdn.net/topics/392163047
wxynxyo 的回复:
你这个问题不是代码的问题,是你系统环境变量配置错了。
你IDEA使用了JDK作为编译和运行环境,然后在LINUX上面检查系统配置,估计是用了JRE
根据wxynxyo 提供的线索,检查服务器的java配置
# which java
/usr/bin/java
# ll /usr/bin/java
lrwxrwxrwx. 1 root root 22 2月 25 18:53 /usr/bin/java -> /etc/alternatives/java
# cd /etc/alternatives
# ll java
lrwxrwxrwx. 1 root root 72 2月 25 18:53 java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/java
可见,java的链接指向的是jre
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre
解决
- 下载jdk的包(比如:jdk-8u171-linux-x64.tar.gz),传到服务器/usr/lib/jvm
- 解压 gzip -cd jdk-8u171-linux-x64.tar.gz | tar -xvf -
- 重新配置java链接的指向
[root@localhost jvm]# ll /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-11.b12.el7.x86_64/jre/bin/java
[root@localhost jvm]# ln -sf /usr/lib/jvm/jdk1.8.0_171/bin/java /etc/alternatives/java
[root@localhost jvm]# ll /etc/alternatives/java
/etc/alternatives/java -> /usr/lib/jvm/jdk1.8.0_171/bin/java
重启Tomcat服务。再次调用就不报错了。