`
luotuoass
  • 浏览: 646180 次
文章分类
社区版块
存档分类
最新评论

JDK 不同版本编译问题

 
阅读更多

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异常。

TongWebJSP容器也是Tomcat呀。应该不会出现这样的问题。原因是什么呢?G一下。找到了原因。总结如下:

出现java.lang.UnsupportedClassVersionError 错误的原因,是因为我们使用高版本的JDK编译的Java class文件试图在较低版本的JVM上运行,所报的错误。

因为,高版本的JDK生成的class文件使用的格式,可能与低版本的JDK.class文件格式不同。这样,低版本的JVM无法解释执行这个.class文件,会抛出java.lang.UnsupportedClassVersionError不支持的Class版本错误。

这个错误尤其在JDK5JDK5之前的版本上表现明显。因为,JDK5Java语法上作了不少增强,引入了一些新的.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.4JVM上。

步骤:项目点右键-->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过高版本的特性,以保持较好的移植性和兼容性。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics