2011-06-17 42 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配置文件。有没有人有解释我的承诺如何消除竞争条件?

相关问题