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

时间:2010-06-19 21:21:24

标签: eclipse equinox p2

我有一个包含多个包的Eclipse功能。我想告诉p2将其中一个软件包标记为在安装该功能时启动。这可以使用捆绑自己的META-INF / p2.inf,如此,

instructions.configure = markStarted(started: true)

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

有些研究让我this document,这表明应该可以将配置指令移动到包含要素的p2.inf。我已经尝试过所有明显的事情了,

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

但到目前为止,我尝试过的所有排列都没有任何影响:因为没有任何反应,捆绑包没有标记为已启动且未报告任何错误。

任何指针都会非常受欢迎。与Eclipse Equinox Galileo(3.5.2)相关...有关Helios的答案也非常有用。

1 个答案:

答案 0 :(得分:9)

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

您基本上必须创建一个完整的Installable Unit fragment。该片段具有相关说明并附加到您的捆绑包的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's

    这些数字有点武断,它们只用于将一组属性(requiresunits或其他属性)与另一组属性分开。 requires这里使用'2'只是因为我从pde.build生成的大p2.inf中复制了它,忘了改变它就像我做了unit.0。

  2. 这一切都是必要的吗?

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

    对于“安装”

    units.0.instructions.install = installBundle(束:$ {工件}); units.0.instructions.uninstall = uninstallBundle(束:$ {工件});

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

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

  3. hostRequirements。可安装的单元片段页面只描述片段的内容,而没有关于如何创建片段的参考。它在Customizing Metadata页面上被提到,但没有解释。

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