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 时,它会清除留下的插件。
我有一个 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 时,它会清除留下的插件。