Eclipse 4.13安裝完插件后再次啟動(dòng)時(shí)失敗的解決辦法

背景簡(jiǎn)介

之前一直使用的是Eclipse 4.9版本,該版本下開(kāi)發(fā)的RCP產(chǎn)品在退出時(shí)一直會(huì)產(chǎn)生一個(gè)如下的NPE:

java.lang.NullPointerException
at org.eclipse.ui.internal.WorkbenchWindow.getExtensionTracker(WorkbenchWindow.java:2792)
at org.eclipse.ui.actions.BaseNewWizardMenu.unregisterListeners(BaseNewWizardMenu.java:260)
at org.eclipse.ui.actions.BaseNewWizardMenu.dispose(BaseNewWizardMenu.java:159)
at org.eclipse.jface.action.MenuManager.dispose(MenuManager.java:250)
at org.eclipse.jface.action.MenuManager.dispose(MenuManager.java:250)
at org.eclipse.jface.action.MenuManager.dispose(MenuManager.java:250)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:40)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:185)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3933)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3564)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.block(ModalContext.java:168)
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:372)
at org.eclipse.jface.dialogs.ProgressMonitorDialog.run(ProgressMonitorDialog.java:474)
at com.jd.lsb.edi.application.ApplicationWorkbenchAdvisor.disconnectFromWorkspace(ApplicationWorkbenchAdvisor.java:312)
at com.jd.lsb.edi.application.ApplicationWorkbenchAdvisor.postShutdown(ApplicationWorkbenchAdvisor.java:285)
at org.eclipse.ui.internal.Workbench.shutdown(Workbench.java:2978)
at org.eclipse.ui.internal.Workbench.busyClose(Workbench.java:1151)
...

然后不經(jīng)意間發(fā)現(xiàn)Eclipse已經(jīng)更新到了4.13版本,從更新日志來(lái)看也是增加了不少新功能,也完善了一些已有的功能,于是產(chǎn)生了更新Eclipse版本的念頭。
說(shuō)干就干,從官網(wǎng)上下載了4.13版本的for RCP版本,然后開(kāi)始安裝當(dāng)前開(kāi)發(fā)需要用到的其他插件,然后折騰的旅程就開(kāi)始了。

問(wèn)題與現(xiàn)象

我們當(dāng)前的開(kāi)發(fā)的產(chǎn)品需要用到GEF、EMF、EMF Query、GMF、ECD以及orbit的一些工具插件,像之前一樣通過(guò)這些插件的update site一一安裝,每次安裝一個(gè)插件后都會(huì)按照提示restart Eclipse,所有插件安裝完畢后,導(dǎo)入原來(lái)的產(chǎn)品源碼,啟動(dòng)運(yùn)行,各種功能沒(méi)有問(wèn)題,然后關(guān)閉退出,之前退出時(shí)的NPE問(wèn)題也沒(méi)有了,perfect。
后來(lái)重啟了電腦,重啟之后啟動(dòng)Eclipse,結(jié)果在選擇完工作空間后,彈出了錯(cuò)誤提示框,提示啟動(dòng)失敗,日志保存在XXX/.metadata/.log文件里,打開(kāi)log文件,發(fā)現(xiàn)是激活Eclipse的Resources插件失敗,最終的異常信息如下:

Root exception:
java.lang.IllegalStateException: The instance data location has not been specified yet.
at org.eclipse.core.internal.runtime.DataArea.assertLocationInitialized(DataArea.java:59)
at org.eclipse.core.internal.runtime.DataArea.getStateLocation(DataArea.java:136)
at org.eclipse.core.internal.runtime.InternalPlatform.getStateLocation(InternalPlatform.java:490)
at org.eclipse.core.runtime.Plugin.getStateLocation(Plugin.java:259)
at org.eclipse.core.internal.resources.LocalMetaArea.<init>(LocalMetaArea.java:63)
at org.eclipse.core.resources.ResourcesPlugin.start(ResourcesPlugin.java:481)
at org.eclipse.osgi.internal.framework.BundleContextImpl3.run(BundleContextImpl.java:842) at org.eclipse.osgi.internal.framework.BundleContextImpl3.run(BundleContextImpl.java:1)
at java.security.AccessController.doPrivileged(Native Method)
...

問(wèn)題分析

從啟動(dòng)日志上來(lái)看,是Resources Plugin在被激活時(shí),所選擇的工作空間目錄還沒(méi)有設(shè)置到Platform所致,也就是說(shuō)有插件過(guò)早的調(diào)用了Resources Plugin中的類(lèi)導(dǎo)致其過(guò)早的被激活。
在eclipse.ini文件中沒(méi)有發(fā)現(xiàn)安裝插件后被添加的異常參數(shù),與純凈版的eclipse.ini文件對(duì)比后沒(méi)有發(fā)現(xiàn)異常。將該文件中的-Dosgi.instance.area.default=@user.home/eclipse-workspace修改為具體的工作空間路徑后,Eclipse依然無(wú)法啟動(dòng)。注釋掉-Dosgi.dataAreaRequiresExplicitInit=true這一行后,Eclipse可以啟動(dòng)成功了,打開(kāi)的是剛配置的工作空間。但是以后總不能就這樣使用Eclipse吧,想換一個(gè)工作空間用還得來(lái)這改這個(gè)ini文件,不能忍,一定還有別的解決辦法。
google之后沒(méi)有找到有用的解決措施,只是發(fā)現(xiàn)Eclipse bugzilla上有人提了一個(gè)bug,表示在安裝了junit插件到導(dǎo)致Eclipse啟動(dòng)失敗,出現(xiàn)跟本文一樣的錯(cuò)誤,按后面的回復(fù)來(lái)看最終原因是依賴(lài)的bnd插件版本是4.0.0,更新到4.1.0后問(wèn)題解決。
可是我沒(méi)有安裝junit插件,查了一下plugins目錄也沒(méi)有發(fā)現(xiàn)bnd插件,說(shuō)明我這個(gè)問(wèn)題不是由bnd版本的問(wèn)題引起的。突然間想到是不是我安裝的插件中也有依賴(lài)的插件存在版本問(wèn)題進(jìn)而導(dǎo)致了這個(gè)問(wèn)題?經(jīng)過(guò)反復(fù)的安裝和卸載(公司的外網(wǎng)下載速度真是一言難盡,說(shuō)多了都是淚T_T),終于發(fā)現(xiàn)在安裝了GMF插件后,再次啟動(dòng)Eclipse就會(huì)失敗并且是跟本文一樣的錯(cuò)誤信息。
沒(méi)道理啊,4.9版本安裝了GMF插件沒(méi)有這問(wèn)題啊,我每次安裝這些插件都是去官網(wǎng)找的最新的update site啊。經(jīng)過(guò)與4.9版本中安裝的GMF插件的對(duì)比,發(fā)現(xiàn)4.9版本安裝的GMF插件是1.12.0的,而在4.13版本中安裝的GMF插件版本是1.9.0的,官網(wǎng)上的Latest Releases里最新的版本就是1.9.0的,1.12.0是Stable Build版,我個(gè)人的習(xí)慣是安裝插件的時(shí)候比較偏向于release版本,WTF!看來(lái)有些時(shí)候一味地求穩(wěn)定也不是好事情。

解決辦法

將GMF插件更新到1.12版本,問(wèn)題解決。

后記

從4.9版本使用了1.12版本的GMF來(lái)看,依我的個(gè)人習(xí)慣,我在4.9上安裝GMF應(yīng)該也是優(yōu)先使用release的1.9版本的,但是4.9中使用的卻是1.12版本的GMF,難道我之前就折騰過(guò)這個(gè)問(wèn)題么?完全沒(méi)有印象啊,莫非真是上年紀(jì)了記憶力減退了?細(xì)思極恐……

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容