需要升级的product是一个eclipse开发的RCP程序。
升级方式:使用旧UpdateManager升级方式(p2之前的升级方式)。只写了一个功能部件,内包含了6个插件,2个fragment。
曾多次升级过。然而某一次做了升级包并升级之后。再次启动程序就打不开了。其日志流如下:
!ENTRY org.eclipse.ui 4 0 2012-06-15 14:29:55.171
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.core.runtime.InvalidRegistryObjectException: Invalid registry object
at org.eclipse.core.internal.registry.RegistryObjectManager.basicGetObject(RegistryObjectManager.java:272)
at org.eclipse.core.internal.registry.RegistryObjectManager.getObject(RegistryObjectManager.java:262)
at org.eclipse.core.internal.registry.ConfigurationElementHandle.getConfigurationElement(ConfigurationElementHandle.java:26)
……
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at com.zxx.frame.Application.start(Application.java:91)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at ……
!ENTRY org.eclipse.core.jobs 2 2 2012-06-15 14:29:56.015
!MESSAGE Job found still running after platform shutdown. Jobs should be canceled by the plugin that scheduled them during shutdown: org.eclipse.core.internal.registry.osgi.ExtensionEventDispatcherJob
网上有些人在讨论这个问题,我看了一下也没看懂。都只是给出了猜测性的提示。我就无法参考。
但对于我本身的这个问题来说其实还是比较好排查的。
我首先重启了,发现该问题亦然存在。--这肯定是这次的升级包有问题。
于是我删除了此次升级的feature以及plugins,再次打开程序,发现还是不行。
怎么办……?偶然间,我打开了程序的另一份(该份这次没有过),OK,这个是能用的。然后我再打开刚才的问题程序,发现现在已经可以用了。
于是经过反复试验,发现只要升级了该次软件包。就会出问题。并且删除软件包后,必须启动一下一个好的Rcp程序后(一个备份)。才可以使用。于是我也猜想,jvm记住了这个rcp程序的某个东西,这个东西是错误的情况下,不能启动错误提供者RCP程序,但可以启动一个正确的RCP程序,并将这个东西的值正常化。至于这个东西是什么,我也不知道。
下面来查查升级包的问题。
观察升级包中plugins中的各个manifest.mf中的版本签名。发现了问题。有一个fragment中manifest.mf中bundle-version写错了2.0.1XXX,版本号竟然比现在(V3.0.0XXX)的低,而在freatures指向的包的后缀时间没错(4.0.0XXX)。修改之后再次升级。问题不再出现。
具体原因不知,有知道的不吝赐教。