P2 垃圾收集器不删除插件

P2 Garbage Collector not deleting plugins

我有一个 RAP 应用程序,我使用 P2 操作 API (org.eclipse.equinox.p2.operations) 根据某些命令行参数安装删除功能。

功能安装和删除正确,但删除功能的插件没有被删除。

经过一些搜索,我看到了我认为是我的问题的答案:Equinox/p2/FAQ

我尝试安装如下功能:

myRapApp -install -profileProperties org.eclipse.update.install.features=true 

关闭系统,然后重新启动它并卸载该功能,确保显式调用 p2 垃圾收集器。请参阅下面的代码:

IQueryResult<IInstallableUnit> queryResult =  getInstalledIUfromID(rootIdToUninstall);

if (queryResult.isEmpty()) {
    log.error("Installable unit {} is not installed.", rootIdToUninstall);
    return false;
}

// --- If found, trigger an UninstallOperation ---------------
UninstallOperation uninstallOperation = new UninstallOperation(this.provisioningSession, queryResult.toSet());
IStatus result = this.performOperation(uninstallOperation);
if (!result.isOK()) {
    String childStatusStr = null;
    for ( IStatus children : result.getChildren()) {
        childStatusStr += "\t" + children.toString() + LINE_SEP;
    }
    log.error("Fail to uninstall {}: {} {} {}", rootIdToUninstall, result.getMessage(), LINE_SEP, childStatusStr);
    if ( result.getException() != null ) {
        log.error("Uninstalling exception:", result.getException());
    }
} else {
    IProfileRegistry profileRegistry = (IProfileRegistry) this.provisioningAgent.getService(IProfileRegistry.SERVICE_NAME);
    IProfile profile = profileRegistry.getProfile(IProfileRegistry.SELF);

    GarbageCollector gc = (GarbageCollector)  this.provisioningAgent.getService(GarbageCollector.SERVICE_NAME);
    gc.runGC(profile);
}

不幸的是,卸载该功能后插件仍然存在。

如何确保我正确指定了 "org.eclipse.update.install.features=true" 属性,-profileProperties org.eclipse.update.install.features=true 似乎没有用。

此外,有没有办法将此 属性 默认设置为 true?

难道我还漏了什么?

[编辑 1] 经过一些故障排除后,我发现使用 tycho 实现的产品可以配置为将配置文件属性 org.eclipse.update.install.features 设置为 true。其实按照tycho的配置就是默认的。

我在 Eclipse 论坛上收到了对这个问题的解释。

问题是每次执行操作时,p2 都会创建一个新版本的配置文件。因此,当卸载后立即调用 GC 时,它将使用 当前版本 配置文件,而不是卸载操作的更新版本。

现在,当在启动时显式调用 GC 时,它会清除留下的插件。