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"
Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐