【问题标题】:How to uninstall old OSGI bundle version upon installation of a new version?如何在安装新版本时卸载旧的 OSGI 捆绑包版本?
【发布时间】:2014-11-21 17:27:08
【问题描述】:

我正在使用 Adob​​e CQ 的 CQ Blueprints maven archetype 将 OSGi 捆绑包部署到 CQ5.6.1。此原型使用Maven Sling Plugin 通过将捆绑包复制到我的内容存储库的安装目录来部署捆绑包。
我正在使用 maven 版本插件在每次构建时更改我的包的版本号。因此,在每次部署时,都会安装一个带有新文件名的包 jar,例如 commons-services-1.0.30.jar。我的问题是,目前较旧的捆绑包版本,如 commons-services-1.0.29.jar,在安装较新版本时不会被删除。
我想避免旧的捆绑版本堆积在我的安装文件夹中。因此我的问题是:在安装新版本时卸载/删除这些旧版本的最佳方法是什么?

【问题讨论】:

    标签: maven osgi aem sling


    【解决方案1】:

    我通过在 myproject-all 模块(请参阅CQBlueprints description for the purpose of this module)中配置 filter.xml 以删除我的捆绑安装文件夹的内容来解决了这个问题。这样,在安装新的包之前,旧包总是会被删除。

    为了删除我的安装文件夹的内容,我在我的 filter.xml 文件中添加了以下行:

    <filter root="/apps/myapp/install">
    

    【讨论】:

      【解决方案2】:

      使用 curl 命令删除特定的 bundle 版本。

      curl -u admin:admin -daction=uninstall http://localhost:4505/system/console/bundles/"name of bundle"
      

      编辑:删除了清除,因为它不适用于 osgi 包。

      【讨论】:

      • 我认为这个问题与 JCR VersionManager 无关,它与 OSGi 捆绑包版本有关,而不是 JCR 节点版本。
      • @BertrandDelacretaz 实际上我在想这个包将作为一个 jcr 节点安装,所以我们可以使用清除来清除它,但我无法获得版本号,所以第二部分不起作用。我们可以做的是创建一个新的调度程序,我们可以安排它在特定时间间隔后运行。在这个调度程序中,我们将从安装文件夹中删除旧节点,并使用模式或使用拆分函数从版本号中提取数字值,为所有捆绑包保留最新版本。
      • 任何方式 curl 部分都可以正常工作,我们可以使用 curl 删除旧版本
      • 谢谢@BertrandDelacretaz :)
      • 谢谢!我希望我可以作为 Maven 构建的一部分自动删除旧版本。我想发出一个删除特定文件的 HTTP 请求不会是一个大问题,但弄清楚要删除哪些特定文件可能是更大的问题。
      【解决方案3】:

      在安装文件夹中堆积的捆绑包并不是真正的问题 - 它们只会使用空间,但是 CQ 用来检测和安装捆绑包的 Apache Sling OSGI 安装程序会忽略它们。安装程序仅考虑捆绑包的最新版本(基于其 OSGi 版本标头),而忽略旧版本。

      如果您真的想删除较旧的捆绑文件,最好创建一个小工具,通过遍历安装它们的 JCR 树(我假设是 /apps)来找到它们,并删除除最新版本之外的所有文件。如果包文件名始终包含版本号,您可能只需使用正确的比较器对它们的名称进行排序,然后删除除最后一个之外的所有文件。如果您想真正健壮,您需要阅读捆绑元数据以了解其版本号。

      如果您想定期自动运行您的工具,您可以注册一个 OSGi EventHook 以检测何时安装了新的捆绑包,并在发生这种情况时触发清理运行。

      很抱歉,这听起来有点复杂 - 但同样,剩余的捆绑文件并不是真正的问题。

      【讨论】:

      • 非常感谢您的详细解答。我希望有一种更直接的方法来删除旧版本,但我认为你的建议是可靠的。您对 Apache Sling OSGI 安装程序根据 OSGi 版本标头选择最新版本的评论使我认为如果捆绑的文件名不包含版本号,问题也会得到解决,但我不确定是否存在使用 Maven Bundle Plugin 从文件名中删除版本号同时将其保留在 OSGi 标头中的方法。
      • 您是对的,对所有版本使用相同的文件名可以解决清除问题,但是在替换文件时您可能会遇到暂时性问题,我不确定安装程序是否可以干净地处理。如果您想使用文件名,最好的办法是使用交替文件名(bundleA、bundleB,然后返回 A),这样您就只有一个剩余文件,并且不会出现暂时性问题。
      • 在我们的开发版本中,我们不会更改捆绑包的文件名。它们始终包含相同的 (x.x.x-SNAPSHOT) 版本号。到目前为止,我们没有遇到任何问题,所以我猜安装程序能够处理这种情况。
      • 如果您想安装旧版本,例如回滚到早期版本怎么办?
      • 删除更高版本应该可以做到这一点。
      猜你喜欢
      • 2017-01-07
      • 1970-01-01
      • 2021-05-24
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2015-01-18
      相关资源
      最近更新 更多