java.lang.ClassNotFoundException: com/sun/tools/internal/xjc/api/XJC
本地环境和生产环境不同
在一个接口对接过程中,在IDEA环境中使用接口方提供的cxf客户端代码调用cxf的webservice接口,运行正常,待到去生产环境部署就会报错。
报错代码
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)
结论应该是本地IDEA使用JDK作为编译和运行环境
而服务器上Tomcat容器使用的是默认的JRE作为运行环境。
这里贴出一个我觉得比较全面的分析
https://blog.csdn.net/Ideality_hunter/article/details/73613161
问题解决
Tomcat默认情况下会用系统的环境变量中找到JAVA_HOME和JRE_HOME。但是有的时候我们需要不同版本的JDK共存。
可以在${TOMCAT_HOME}/bin/catalina.bat最前面设置JAVA_HOME和JRE_HOME。
set JAVA_HOME=D:\JAVA_HOME\java6\jdk1.6.0_45
set JRE_HOME=D:\JAVA_HOME\java6\jdk1.6.0_45\jre
或修改${TOMCAT_HOME}/bin/setclasspath.bat文件中添加
set "JAVA_HOME=D:\JAVA_HOME\java6\jdk1.6.0_45"
set "JRE_HOME=D:\JAVA_HOME\java6\jdk1.6.0_45\jre"
在linux下Tomcat配置连接jdk路径${TOMCAT_HOME}/bin/catalina.sh或setenv.sh文件:
export JAVA_HOME=/usr/java/jdk1.7.0_55
export JRE_HOME=/usr/java/jdk1.7.0_55/jre
另外,有时需要设置Tomcat的最大内存,方法如下:
windows下在catalina.bat中添加
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
linux下在catalina.sh中添加
JAVA_OPTS="-Xms256m -Xmx512m -Xss1024K -XX:PermSize=128m -XX:MaxPermSize=256m"