But why aren't uninstalled bundles/features immediately removed?
p2 does not immediately remove bundles on uninstall for several reasons:
Minimizing waste: By retaining the bundles, p2 can save time and bandwidth to should these bundles be re-installed.
For safety: Many bundles do not properly support hot-swapping and removal. Writing bundles that can be uninstalled completely is surprisingly difficult, and even harder to test.
In practice the timing of deletion should not matter as p2 ensures that the bundles will not be re-installed (modulo the org.eclipse.update.configurator issue described elsewhere in this FAQ).
p2 does periodically perform a garbage collection of uninstalled features and bundles, typically after having performed another uninstall. See elsewhere in this FAQ for details on how to explicitly request a garbage collect.
Why aren't bundles being removed when their associated feature has been removed?
There are two aspects to this problem.
First, you should ensure that features are recorded when installing a feature by specifying the "org.eclipse.update.install.features=true" property, such that the bundles have a recorded dependency against the feature. This property is not the default, so if you are using the p2 director manually it is worth verifying.
Second, you must invoke the p2 garbage collector.[1] By default, p2 only performs a garbage collect at its discretion. Normally this is fine since the actual bundles to be loaded are still known and managed (either in the config.ini file or by the simpleconfigurator).
You can cause a garbage collect in one of 3 ways:
Configure your product to invoke a GC on startup by adding the following line to your product's plugin_customization.ini (requires the org.eclipse.equinox.p2.ui.sdk.scheduler bundle):
org.eclipse.equinox.p2.ui.sdk.scheduler/gcOnStartup=true
Run the garbage collector application:[2]
eclipse -application org.eclipse.equinox.p2.garbagecollector.application -profile SDKProfile
Explicitly invoke the p2 garbage collection from code:
IProvisioningAgentProvider provider = // obtain the IProvisioningAgentProvider using OSGi services
IProvisioningAgent agent = provider.createAgent(null); // null = location for running system
if(agent == null) throw new RuntimeException("Location was not provisioned by p2");
IProfileRegistry profileRegistry = (IProfileRegistry) agent.getService(IProfileRegistry.SERVICE_NAME);
if (profileRegistry == null) throw new RuntimeException("Unable to acquire the profile registry service.");
// can also use IProfileRegistry.SELF for the current profile
IProfile profile = profileRegistry.getProfile("SDKProfile");
GarbageCollector gc = (GarbageCollector) agent.getService(GarbageCollector.SERVICE_NAME);
gc.runGC(profile);
转自:https://wiki.eclipse.org/Equinox/p2/FAQ#cite_note-2
分享到:
相关推荐
三、插件卸载机制 1. **停用**:在卸载之前,Jira会先停用插件,将其服务从服务注册表中移除,确保其他组件不再依赖它。 2. **依赖检查**:检查其他插件是否依赖于要卸载的插件,如果有,卸载操作会被阻止,以防止...
此时,Webplugin视频插件通过提供这些格式的解码器,使浏览器能够播放这些文件。 Webplugin视频插件还可能包含额外的特性,例如: 1. **跨平台兼容性**:确保视频在不同的操作系统(如Windows、MacOS和Linux)以及...
在Linux系统中,C语言插件(plugin)的实现技术是一项关键的软件开发技能,它允许程序在运行时动态加载和卸载代码模块,增强了软件的可扩展性和灵活性。插件通常以动态链接库(.so文件)的形式存在,使得主程序可以...
解压后,将其中的dll文件复制到NOTEPAD++的plugins目录下,然后重启NOTEPAD++,就可以在“插件”菜单中找到并启动PluginManager。启动后,用户可以看到一个清晰的界面,列出了所有可用的插件,只需简单点击安装按钮...
在IT行业中,"plugin"一词通常指的...综上所述,"plugin文件"的相关知识点涵盖了插件的原理、开发和使用,涉及到源码分析、工具集成以及可能的多语言环境。深入理解这些概念和技术将有助于提升软件开发的灵活性和效率。
PluginManager是Notepad++的官方插件,它提供了一个图形用户界面,让用户能够浏览、安装、更新或卸载Notepad++的各种插件。通过这个插件,你可以发现并尝试各种各样的插件,这些插件可能包括代码高亮、自动完成、...
本篇将详细探讨Android-Plugin插件设计中的资源获取策略。 首先,我们需要理解Android应用的基本结构。一个标准的Android应用由多个组件(如Activity、Service、BroadcastReceiver和ContentProvider)以及资源文件...
这些信息将在插件安装前展示给管理员查看,并且需要管理员同意后才能继续安装。 **XML文件示例**: ```xml <item id="plugin"> <item id="version"><![CDATA[1.0]]> <item id="installfile"><![CDATA[install....
当你在Notepad++中安装了PluginManager后,会在“Plugins”菜单下看到一个名为“Plugin Manager”的选项。点击这个选项,就会打开一个窗口,列出了所有可用的插件。这些插件通常按照功能类别进行分类,如语法高亮、...
在Qt 5.9版本中,Qt对插件的支持已经相当成熟,它提供了丰富的API和工具,如`QMetaObject`用于插件的元对象通信,`QLibrary`用于动态库的加载和卸载等。开发者可以利用这些工具轻松地构建复杂且可扩展的应用程序,...
7. **编译与安装**:构建完成后,将插件库(通常是`.dll`或`.so`文件)复制到Qt Creator的插件目录。重启Qt Creator,新插件应该已经生效,你可以在工具栏中看到你添加的按钮。 8. **调试与测试**:使用Qt Creator...
此外,在打包之前,确认插件的Manifest文件(plugin.xml)和其他配置文件都已正确填写和配置。Manifest文件是插件信息的核心,它描述了插件的基本属性和与其他插件的依赖关系。如果这个文件配置错误,将会影响插件的...
在主应用程序中,通过调用QPluginLoader的load()方法,可以加载指定路径下的插件库(通常是.dll或.so文件)。 Qt插件的开发过程主要包括以下步骤: 1. **定义接口**:首先,你需要定义一个插件接口,这是所有插件...
《Tangram Plugin Framework:基于Delphi的模块化插件框架探索》 在软件开发领域,模块化设计已经成为提升代码可维护性和扩展性的重要手段。本文将深入探讨Tangram Plugin Framework,这是一个专为Delphi编程环境...
开发完成后,使用NSIS编译器(makensis.exe)生成安装程序,通过实际安装和卸载来测试插件功能。如果遇到问题,可以使用调试工具(如Visual Studio的调试器)来定位和修复。 总之,通过C++开发NSIS插件可以极大地...
PluginManager允许用户方便地浏览、安装、更新和卸载Notepad++的插件。这个插件本身就像一个应用商店,为用户提供了一个统一的界面来管理各种增强Notepad++功能的插件。安装PluginManager可以显著提升Notepad++的...
4. **动态加载**:DroidPlugin提供API用于动态加载和卸载插件,例如`DroidPluginManager.loadPlugin()`方法用于加载插件APK,`DroidPluginManager.unloadPlugin()`方法用于卸载已加载的插件。 5. **生命周期管理**...
通过DroidPlugin,开发者可以将大型应用拆分为多个小的插件,这些插件可以在运行时动态安装和卸载,极大地提高了应用的更新效率和用户体验。 二、核心机制 1. 插件隔离:DroidPlugin利用ClassLoader的隔离性,为每...
在IT行业中,DLL(Dynamic Link Library)插件是一种常见的软件扩展机制,允许程序通过外部库文件来添加功能或实现特定任务。"Plugin DLL插件制作全示例"这个主题覆盖了创建和使用DLL插件的基本步骤和技术,适用于...