2011-06-17 44 views
3

我在Eclipse啓動時嘗試更新Eclipse插件時遇到一些問題。在Eclipse啓動時,我的程序在Help -> Check for Updates處彈出對話框。但是,當用戶快速進行更新時,Eclipse會拋出一個異常,指出p2配置文件正在使用中。我相信這是因爲其他Eclipse作業在啓動時使用了p2配置文件,因此我的程序無法使用p2配置文件更新插件。我如何安全地使用p2配置文件?我怎樣才能單獨使用p2配置文件?如何安全地使用Eclipse p2配置文件?

我已經上傳了github重現問題所需的最小代碼片段。而且,我已經在an issue on the github repository中詳細描述了問題和步驟。

回答

0

您可以從UpdateOperation獲得ProvisioningJob,讓它屬於正在運行的配置文件更改作業系列。見org.eclipse.core.runtime.jobs.Job.belongsTo(Object)

再說,我有兩個想法通過使用內部API做到這一點,

  1. 嘗試測試鎖定檔案,看看是否它被改變。 org.eclipse.equinox.internal.p2.engine.SimpleProfileRegistry.lockProfile(Profile)
  2. 運行你以前的樣子,但是趕上IlegalStateException,然後在IProvisioningEventBus上註冊一個ProvisioningListener,當正在運行的profilechangeoperation完成時被通知。
+0

@Kane:顯然可以直接鎖定和解鎖配置文件。但是,它需要使用內部API,這是不鼓勵的。您建議從UpdateOperation獲取ProvisioningJob,並確保它屬於正在運行的配置文件更改作業系列。但是,我如何才能找到正在運行的配置文件更改作業的系列? – reprogrammer 2011-06-17 05:42:29

+0

我想你可以在SimpleProfileRegistry.lockProfile的方法中添加斷點來查看哪個作業正在鎖定配置文件。 – Kane 2011-06-17 05:49:26

+0

實現'Job.belongsTo'的'ProvisioningJob'是'LoadMetadataRepositoryJob'。所以,我們不能使用工作組來強制對配置文件進行獨佔訪問。 – reprogrammer 2011-06-18 00:16:49

0

My commit通過調用命令「org.eclipse.equinox.p2.ui.sdk.update」而不是調用以下方法打開「檢查更新」對話框。

org.eclipse.equinox.p2.ui.ProvisioningUI.openUpdateWizard(boolean, UpdateOperation, LoadMetadataRepositoryJob)

出人意料的是,這種變化似乎解決與競爭狀態的問題在訪問P2配置文件。有沒有人有解釋我的承諾如何消除競爭條件?

相關問題