【问题标题】:Using Apache ACE for automatic OSGI software distribution使用 Apache ACE 进行自动 OSGI 软件分发
【发布时间】:2024-01-06 21:11:02
【问题描述】:

我正在使用 Apache ACE 将 OSGI 捆绑包部署到目标,我可以成功地使用 apace ace UI 手动执行此操作,但是当我尝试通过在“Gogo Shell 客户端 API”中运行 shell 脚本来执行此操作时,我无法在创建一个功能之前检查一个功能是否存在或是否存在关联。此外,我无法通过 shell 中的脚本删除工件和功能之间的关联。 对此的任何想法都会非常有帮助。 谢谢

【问题讨论】:

    标签: osgi software-distribution apache-ace


    【解决方案1】:

    要检查某个特征或关联是否存在,您可以使用工作区上的“lf”(用于特征)命令来查询它。例如,如果要检查是否存在名为“test”的功能,可以使用:

    res = ($workspace lf "(name=test)")
    if { (coll:first $res) } { echo "yes" } { echo "no" }
    

    第一行列出了与模式匹配的所有特征。它返回一个集合。 第二行从列表中获取第一项(如果存在),并基于该“if”子句执行。如果你愿意,你可以把它浓缩成一行,为了清楚起见,我把它分开了。

    删除特征或关联如下:

    $workspace df "(name=test)"
    

    删除与表达式匹配的所有特征,或者如果您在 shell 变量中已经有一个特征对象:

    $workspace df $featureObject
    

    同样适用于关联,例如工件和功能之间的关联,假设您要删除具有特定符号名称的包和称为测试的功能之间的关联:

    $workspace da2f "(&(leftEndpoint=\\28Bundle-SymbolicName=org.foo\\29)(rightEndpoint=\\28name=test\\29))"
    

    请注意,我需要将 leftEndpoint 和 rightEndpoint 值中的括号转义为 \\28\\29,因为我们不能直接在表达式中使用它们。

    【讨论】:

    • 我尝试创建一个名为 test 的功能并尝试删除它,但无法做到。这些是我遵循的步骤g! $w cf 测试 g! $w lf [名称=测试] g! $w df "(name=test)" gogo: IllegalArgumentException: 无法将 df(String) 强制转换为 [(FeatureObject)] 中的任何一个。你能指出这有什么问题吗?
    • 是的,您可能正在最新版本上尝试此操作,而我正在使用 SVN 的最新代码(从内存中,该代码尚不支持将表达式作为参数的 df 命令。相反,您可以使用 lf 查询对象,然后使用 coll:first 获取第一个(也是唯一的)项目,然后使用对 df 的引用来删除它。