将WebApp从开发环境部署到生产环境,访问页面出现错误:
Caused by: java.lang.UnsupportedClassVersionError: com/wzr/dao/service/EmployeeService : Unsupported major.minor version 52.0 (unable to load class com.wzr.dao.service.EmployeeService)
at org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2476)
...
说明:这里com/wzr/dao/service/EmployeeService是自己定义的类.
错误原因是开发环境tomcat所用的jre(JVM)与生产环境jre版本不一致造成的.
浏览器登录tomcat,查看Complete Server Status发现:
JVM Version:1.7.0_79-mockbuild_2015_04_15_00_02-b00
命令行查看:
# /usr/local/tomcat/bin/catalina.sh version
Using CATALINA_BASE: /usr/local/tomcat
Using CATALINA_HOME: /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME: /usr/java/default
Using CLASSPATH: /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Server version: Apache Tomcat/8.0.21
Server built: Mar 23 2015 14:11:21 UTC
Server number: 8.0.21.0
OS Name: Linux
OS Version: 2.6.32-504.16.2.el6.x86_64
Architecture: amd64
JVM Version: 1.8.0_74-b02
JVM Vendor: Oracle Corporation
两个JVM版本不一致,查看当天日志
localhost.2016-04-01.log
01-Apr-2016 08:00:58.933 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/lib/jvm/java-1.7.0-openjdk-1.7.0.79.x86_64/jre
也就是说/usr/local/tomcat/bin/下的tomcat使用的是/usr/java/default下1.8.0的jre,而随系统启动的tomcat启动时加载的却是/usr/lib/jvm/下的1.7.0的jre
搜索配置了jre路径的配置文件:
find /usr/local/tomcat | xargs grep -ril "JRE_HOME"
得到
...
/usr/local/tomcat/bin/setclasspath.bat
/usr/local/tomcat/bin/tool-wrapper.sh
/usr/local/tomcat/bin/catalina.bat
/usr/local/tomcat/bin/tool-wrapper.bat
/usr/local/tomcat/bin/catalina.sh
/usr/local/tomcat/bin/setclasspath.sh
查看catalina.sh
...
# Do not set the variables in this script. Instead put them into a script
# setenv.sh in CATALINA_BASE/bin to keep your customizations separate.
...
# JAVA_HOME Must point at your Java Development Kit installation.
# Required to run the with the "debug" argument.
#
# JRE_HOME Must point at your Java Runtime installation.
# Defaults to JAVA_HOME if empty. If JRE_HOME and JAVA_HOME
# are both set, JRE_HOME is used.
按官方建议新建:setenv.sh
export JRE_HOME=/usr/java/default
重启服务或重启服务器
# /usr/local/tomcat/bin/shutdown.sh
# /usr/local/tomcat/bin/startup.sh
再次访问页面,成功.
另外,也可以通过修改setclasspath.sh文件,在里面添加下面变量解决问题。如下所示
export JRE_HOME=.......
(或)export JAVA_HOME=......