问题现象
某同事中途接手为我们的一个甲方负责维护我们公司的一个平台。公司的平台是基于eclipse的rcp技术开发。公司此平台的服务器端运行在ibm jre1.4.2上,客户端运行在sun的jre1.4.2上。部分客户端上也有使用版本为1.5.x的jre。 有一次同事根据甲方需求修改了部分旧插件,其中有一个插件会导出jna的相关包,以便其它插件调用第三方动态库时方便使用。此次同事没有调整这块的内容。在开发测试、SIT测试时都正常。 投产部署到服务器后,客户端登录后自动更新插件到本地后,并且重启客户端。重启后,部分客户端在登录界面上提示找不到usbkey相关信息。也就是说有一部分客户端更新后用户无法使用u盾登录到系统了,但在更新前还可以使用u盾正常登录系统。 在更新不能正常使用u盾的客户端的日志中有找到下列异常日志: java.lang.UnsupportedClassVersionError: com/sun/jna/Native (Unsupported major.minor version 49.0) at java.lang.ClassLoader.defineClass0(Native Method) at java.lang.ClassLoader.defineClass(Unknown Source) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.defineClass(DefaultClassLoader.java:160) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.defineClass(ClasspathManager.java:498) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findClassImpl(ClasspathManager.java:468) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClassImpl(ClasspathManager.java:427) at org.eclipse.osgi.baseadaptor.loader.ClasspathManager.findLocalClass(ClasspathManager.java:410) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.findLocalClass(DefaultClassLoader.java:188) at org.eclipse.osgi.framework.internal.core.BundleLoader.findLocalClass(BundleLoader.java:339) at org.eclipse.osgi.framework.internal.core.SingleSourcePackage.loadClass(SingleSourcePackage.java:37) at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:379) at org.eclipse.osgi.framework.internal.core.BundleLoader.findClass(BundleLoader.java:352) at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:83) at java.lang.ClassLoader.loadClass(Unknown Source)
也就是说,插件调用u盾时是通过jna方式调用厂商动态库的。但是更新一个会导出jna相关包的插件(更新时只是增加其它与jna本身没有相关的内容)后,客户端竟然奇妙出现UnsupportedClassVersionError问题。
查看更新包中com.sun.jna.Native类的主版本不是49,而是jre1.4支持的48。此插件中的com.sun.jna包中的类没有版本问题。 同事们把有问题客户端复制到自己的机器,使用与有问题客户端的jre版本完全一致的jre运行客户端后调用u盾是正常的。 遇到这种奇妙的问题又不能及时解决,只能先回切程序版本,放弃此次投产更新了。此次投产以失败告终。