症狀:
運行RCP application後,在Project Explorer裏面右鍵某個項目,可以看到context menu裏面有Run As這麼個選項,可是當第二次右鍵同一個項目時,Run As卻消失了,不管你有沒有真正地Run這個application,Run As都只會在context menu中出現一次。
調查:
在org.eclipse.debug.ui這個插件的extension point中有這麼一段邏輯
<extension point="org.eclipse.ui.popupMenus">
...
<objectContribution
objectClass="java.lang.Object"
id="org.eclipse.debug.ui.contextualLaunch.run">
<action
label="%RunContextMenu.label"
style="pulldown"
class="org.eclipse.debug.internal.ui.actions.RunContextualLaunchAction"
menubarPath="additions"
enablesFor="+"
id="org.eclipse.debug.ui.contextualLaunch.run.submenu">
</action>
<enablement>
<or>
<and>
<not><with variable="org.eclipse.core.runtime.Platform">
<test property="org.eclipse.core.runtime.bundleState" args="org.eclipse.debug.core" value="ACTIVE"/>
</with></not>
<adapt type="org.eclipse.core.resources.IResource"/>
<and>
<with variable="org.eclipse.core.runtime.Platform">
<test property="org.eclipse.core.runtime.bundleState" args="org.eclipse.debug.core" value="ACTIVE"/>
</with>
<test property="org.eclipse.debug.core.launchable" value="run"/>
</and>
</or>
</enablement>
</objectContribution>
...
</extension>
仔細分析這段邏輯,可以看出,org.eclipse.core.runtime.bundleState這個屬性是否爲ACTIVE,即這個plugin是否已經被load,會對Run As這個context menu是否enable有不同的影響。
在bundleState沒有ACTIVE的情況下,只要是可適應(adaptable to)org.eclipse.core.resources.IResource的都會顯示出來;在bundleState ACTIVE的情況下,會通過執行org.eclipse.debug.core.launchable這個測試屬性來判斷。org.eclipse.debug.core.launchable定義於org.eclipse.debug.core,在org.eclipse.debug.internal.core.LaunchablePropertyTester 中執行一個測試方法。這個方法會檢測是否有 run 這個launch mode存在,並且選中的這個項目或者文件是否有org.eclipse.debug.ui.actions.ILaunchable這個adaptor。
解決方法:
把ILaunchable這個adaptor加到相應的文件或者項目中去
即,在plugin.xml中加上這麼一段
<extension point="org.eclipse.core.runtime.adapters">
<factory class="org.eclipse.core.runtime.IAdaptable"
adaptableType="org.eclipse.core.resources.IResource">
<adapter type="org.eclipse.debug.ui.actions.ILaunchable"/>
</factory>
</extension>