java.lang.UnsupportedClassVersionError
错误原因
一直在tomcat服务器上做开发,客户要求部署到TongWeb服务器上,并且要求JDK版本为<chsdate year="1899" month="12" day="30" islunardate="False" isrocdate="False" w:st="on"><span lang="EN-US" style="font-size:12.0pt">1.4.2</span></chsdate>。把WEB应用部署到TongWeb上,本来在tomcat正常的运行的程序在TongWeb上出现了java.lang.UnsupportedClassVersionError异常。
TongWeb的JSP容器也是Tomcat呀。应该不会出现这样的问题。原因是什么呢?G一下。找到了原因。总结如下:
出现java.lang.UnsupportedClassVersionError
错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。
因为,高版本的JDK生成的class文件使用的格式,可能与低版本的JDK的.class文件格式不同。这样,低版本的JVM无法解释执行这个.class文件,会抛出java.lang.UnsupportedClassVersionError不支持的Class版本错误。
这个错误尤其在JDK5与JDK5之前的版本上表现明显。因为,JDK5在Java语法上作了不少增强,引入了一些新的.class文件的元素,导致旧版本的JVM无法解释、执行.class文件。即使这个类并没有使用任何JDK5的新元素,但是JDK5生成的.class文件,JDK1.4及其以前的JVM都无法辨认!
所以,目前使用最广的,还是JDK1.4。很多软件和项目都无法使用JDK5。
有一个名叫 Toby Reyelts 的开发人员决定消除 JDK 5.0 编译器限制。结果就是开放源代码的
Retroweaver 项目(参见 参考资料)。Retroweaver
使用 classworking 技术来修改由 JDK 5.0 编译器生成的二进制类表示,以便这些类可以与早期的 JVM 一起使用。
它通过修改JDK5生成的.class文件,将其变为JVM1.4及之前版本能够运行的.class文件。
目前,使用新版本的IDE编译程序可能会造成你遭遇java.lang.UnsupportedClassVersionError
错误。
比如,Eclipse3.3+MyEclipse6.5这个新版的IDE工具。进入首选项---Java---编译器,可以看到,默认的编译器依从等级是5.0,这里改为1.4,因为我们使用的软件需要运行在JDK1.4的JVM上。
步骤:项目点右键-->Properties-->Java
Compiler-->将Enable project specific settings前的勾去掉-->Compiler compiliance level选择你想要的版本
在MyEclipse----应用服务器下,指定Tomcat5。指定Tomcat使用jdk1.4。
这样,就全部指定使用Jdk1.4来编译和运行程序了。如果全部指定jdk5也是可以的。但是,绝对不能够使用jdk5编译程序,而又在jdk1.4上运行程序,那样将会抛出java.lang.UnsupportedClassVersionError不支持的Class版本错误。反之,则可以。
这种情况下,不论是Eclipse生成的war包,还是ant文件生成war包,都使用jdk5编译,就会在运行时出现错误,该应用程序将无法启动。如果你查看Tomcat的日志文件,将会看到正是java.lang.UnsupportedClassVersionError错误发生了!
经验:以后做开发,如果可能的话,尽量使用JDK1.4,1.5来编译源程序,不要使用JDK过高版本的特性,以保持较好的移植性和兼容性。
分享到:
相关推荐
jdk1.8编译类文件反编译工具。使用方式:java -jar procyon-decompiler-0.5.30.jar ***.class -o c:\**
非常好用的反编译工具jd-gui,反编译工具支持jdk1.7及以下反编译,反编译工具支持jdk1.7及以下反编译
jdk反编译工具jdk反编译工具jdk反编译工具jdk反编译工具jdk反编译工具jdk反编译工具
支持jdk1.2 jdk1.3 jdk1.4 jdk1.5 jdk1.6 支持目录对目录 支持直接双击class文件看源代码
github上下载的weixin-java-tools-1.3.3是jdk1.7版本以上编译的,在jdk1.6版本以下无法使用,此架包是经过jdk1.6重新编译打包,可以在jdk1.6的环境下运行。
java jdk1.7源码包,用于centos7使用jdk1.7编译openjdk1.8的 1.7版本
此版本是基于jdk1.8进行编译。可在相应的环境下运行。 opencv4.8.0人脸识别的类库,在windows 10 下 vs2022的cmaker编译。原生的opencv4.8.0是基于jdk11编译的。此版本是基于jdk1.8进行编译。可在相应的环境下运行。...
crosswalk SslUtil使用1.7jdk版本编译,忽略https
对于想了解JDK源码的朋友来说,通过调试JDK源码来...要达到这个目的,一是找网上人家已经编译好的版本;二是自己去编译jdk源码,如何自己编译可以参看我的博客:http://blog.csdn.net/ftp_2014/article/details/51087603
crosswalk SslUtil使用1.8jdk版本编译,忽略https
1.okhttp3.8源码使用jdk1.6重新编译,已集成了okio,在javaweb项目中使用,未在安卓项目中使用 2.okhttp3.8源码使用jdk1.6重新编译_okhttp3.8.0-jdk1.6.jar
下载后解压即可使用,里面包含jdk1.8的api文档和jd-gui1.4反编译工具
java jdk 反编译 将class文件反编译成java文件 不用安装 直接使用小程序 即可将.class文件反编译成.java文件
支持jdk1.6 支持编译单个或指向某文件
关于JDK的编译与运行,更好的帮你学习JSP的相关知识
JDK8 下 SpringBoot 应用动态编译 Java 源码并注入 Spring 容器,实现动态修改接口和抽象类的实现。注意,项目以 Jar 包形式启动时要在命令行引入 tools.jar 的包,IDEA下可直接调试。 基于接口、抽象类实现不停机...
java反编译工具,方便查看class文件,
dubbo-Admin JDK8编译 可以直接运行 JDK8+TOMCAT7 欢迎各位老板下载
反编译JAVA.class文件,特别是在没有原码地情况 ,适时地进行反编译,可以看到相关地原码!