gpt4 book ai didi

eclipse - 在 Equinox 中,是否可以将 OSGi 包标记为从其包含功能的 p2.inf 开始?

转载 作者:行者123 更新时间:2023-12-02 12:12:09 28 4
gpt4 key购买 nike

我有一个 Eclipse 功能,其中包含多个 bundle 。我想告诉 p2 在安装该功能时将其中一个 bundle 标记为已启动。这可以使用 bundle 自己的 META-INF/p2.inf 来实现,如下所示,

instructions.configure = markStarted(started: true)

但我想在功能级别而不是 bundle 级别执行此操作(相关 bundle 是第三方的,如果可能的话,我不希望以任何方式修改它)。

一些研究让我得出this document这表明应该可以将配置指令移动到包含功能的 p2.inf 中。我已经尝试过所有明显的事情,例如,

units.0.id = <bundle symbolic name>
units.0.instructions.configure = \
org.eclipse.equinox.p2.touchpoint.eclipse.markStarted(started: true)

但到目前为止,我尝试过的所有排列都没有任何效果:因为什么也没有发生,所以 bundle 没有标记为已启动,也没有报告错误)。

非常欢迎任何指点。与 Eclipse Equinox Galileo (3.5.2) 一起使用...与 Helios 相关的答案也非常有用。

最佳答案

“单位.#”。 p2.inf 条目创建一个新的 Installable Unit ,它们不会修改其他现有的 IU。

您基本上必须创建整个 Installable Unit fragment 。该片段包含相关说明并附加到您的 bundle 的 IU。然后,您需要将您的功能的要求添加到这个新的 IU。

PDE/Build 在构建产品时会自动执行此操作。您可以通过创建一个小型 rcp 产品构建来查看生成的 p2.inf,该构建具有 bundle 的启动级别。
产品构建中生成的 p2.inf 将为 buildDirectory/features/org.eclipse.pde.build.container.feature/product/p2.inf

这是我根据构建修改的示例,它设置了 org.eclipse.equinox.common 的启动级别。 $version$ 将被 p2.inf 所属功能的版本替换。请注意“hostRequirements”,它指定了我们所属的包的片段。

#create a requirement on the IU fragment we are creating
requires.2.namespace=org.eclipse.equinox.p2.iu
requires.2.name=configure.org.eclipse.equinox.common
requires.2.range=[$version$,$version$]
requires.2.greedy=true

#create a IU frament named configure.org.eclipse.equinox.common
units.0.id=configure.org.eclipse.equinox.common
units.0.version=$version$
units.0.provides.1.namespace=org.eclipse.equinox.p2.iu
units.0.provides.1.name=configure.org.eclipse.equinox.common
units.0.provides.1.version=$version$
units.0.instructions.install=installBundle(bundle:${artifact});
units.0.instructions.uninstall=uninstallBundle(bundle:${artifact});
units.0.instructions.unconfigure=setStartLevel(startLevel:-1);markStarted(started:false);
units.0.instructions.configure=setStartLevel(startLevel:2);markStarted(started:true);
units.0.hostRequirements.1.namespace=osgi.bundle
units.0.hostRequirements.1.name=org.eclipse.equinox.common
units.0.hostRequirements.1.range=[3.6.0.v20100503,3.6.0.v20100503]
units.0.hostRequirements.1.greedy=false
units.0.hostRequirements.2.namespace=org.eclipse.equinox.p2.eclipse.type
units.0.hostRequirements.2.name=bundle
units.0.hostRequirements.2.range=[1.0.0,2.0.0)
units.0.hostRequirements.2.greedy=false
units.0.requires.1.namespace=osgi.bundle
units.0.requires.1.name=org.eclipse.equinox.common
units.0.requires.1.range=[3.6.0.v20100503,3.6.0.v20100503]
units.0.requires.1.greedy=false

问题解答:

  1. 0、1、2

    这些数字有些随意,它们仅用于将一组属性(requiresunits 或其他)与另一组属性分开。这里的 requires 使用了“2”,只是因为我从 pde.build 生成的大型 p2.inf 中复制了它,并且忘记像对units.0 那样更改它。

  2. 这一切有必要吗?

    是的。需要 type=bundle 上的第二个 hostRequirements。在 Helios 中,除了翻译片段之外,只有一个片段可以附加到 IU。通常,可以使用默认 IU 来设置所有 osgi 包的默认启动级别。为了选择我们的自定义片段而不是默认片段,它必须具有更高的“特异性”,即满足主机要求的数量。

    对于“安装”

    units.0.instructions.install=installBundle(bundle:${artifact});units.0.instructions.uninstall=uninstallBundle(bundle:${artifact});

    instructions.installinstructions.uninstall 指的是 p2 进程的阶段。 installBundleuninstallBundle 指的是 OSGi 意义上的安装/卸载。您必须先将 bundle 安装到 OSGi 系统中,然后才能执行其他操作。这基本上涉及将其添加到 config.ini 或 org.eclipse.equinox.simpleconfigurator/bundles.info 文件中。

    大多数 p2 安装已经包含默认配置 IU,它将安装并设置 bundle 的默认启动级别 (4)。但是,目前每个包只能应用一个配置片段,因此当您像这样添加自己的配置片段时,默认值将不再应用于您的包。

  3. 主机要求。可安装的单元片段页面仅描述片段是什么,没有提及如何创建片段。 Customizing Metadata 中明确提到了这一点。页面,但没有解释。

    文档,wiki 上的 p2 category 下有很多东西。 。 touchpoint instructions 上的页面可能很有趣。 help.eclipse.org 有一些帮助,但总的来说,我认为这比文档中的内容更先进。

关于eclipse - 在 Equinox 中,是否可以将 OSGi 包标记为从其包含功能的 p2.inf 开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3077282/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com