JVM版本引起的一个错误java.lang.UnsupportedClassVersionError

将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=......

猜你喜欢

转载自asjava.iteye.com/blog/2288169