java.lang.UnsupportedClassVersionError 错误原因
一直在tomcat服务器上做开发,客户要求部署到TongWeb服务器上,并且要求JDK版本为 1.4.2 。把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过高版本的特性,以保持较好的移植性和兼容性。