今天在练习“第33章 让软件具有更好的扩展性”的33.2小结时,把myplugin插件安装到RCP项目后,就出现了“java.lang.UnsupportedClassVersionError”的错误
(1)
用高版本jdk编译好的class无法在低版本JVM上运行导致的。这一问题在jdk1.5和更早版本这两者之间尤其明显。
别说,我真的是装了1.42和1.5两个版本的jdk。
解决办法:以IDE使用Eclipse为例,打开菜单 Windows -> Preferences -> Java -> Compiler, 在JDK compiliance里面compiler compiliance level一项改成和机器正在用的JVM同样版本,我的情况是从1.5改成1.4。
另外,如果之前对某个project单独设置过build path或者compile设置,最好改完上面的也单独看一下那个project的设置是否一起变过来了。我的情况就是没变过来还要专门改一次。
(2)
出现 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.2+MyEclipse5.0 这个新版的 IDE 工具。进入首选项 ---Java--- 编译器,可以看到,默认的编译器依从等级是 5.0, 这里改为 1.4 ,因为我们使用的软件需要运行在 JDK1.4 的 JVM 上。
同一配置区下的已安装 JRE 中,不要安装 JRE ,而是安装 JDK ,指定 1.4 或 1.5 的 JDK 。还是使用 jdk1.4 。
在 MyEclipse---- 应用服务器下,指定 Tomcat5 。指定 Tomcat 使用 jdk1.4 。
这样,就全部指定使用 Jdk1.4 来编译和运行程序了。如果全部指定 jdk5 也是可以的。但是,绝对不能够使用 jdk5 编译程序,而又在 jdk1.4 上运行程序,那样将会抛出 java.lang.UnsupportedClassVersionError 不支持的 Class 版本错误。
这种情况下,不论是 Eclipse 生成的 war 包,还是 ant 文件生成 war 包,都使用 jdk5 编译,就会在运行时出现错误,该应用程序将无法启动。如果你查看 Tomcat 的日志文件,将会看到正是 java.lang.UnsupportedClassVersionError 错误发生了!