“单位。#。” p2.inf 条目创建一个新的Installable Unit,它们不会修改其他现有的 IU。
您基本上必须创建一个完整的可安装单元片段。该片段具有相关说明并附加到您的捆绑包的 IU。然后你需要从你的特性中添加一个需求到这个新的 IU。
PDE/Build 在构建产品时会自动执行此操作。您可以通过创建一个小 rcp 产品构建来查看生成的 p2.inf,该构建具有您的捆绑包的起始级别。
在产品构建中生成的 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
问题解答:
0、1、2
这些数字有些随意,它们仅用于将一组属性(requires
或units
其他)与另一组属性分开。这里requires
使用“2”只是因为我从一个由 pde.build 生成的大型 p2.inf 中复制了它,而忘记像我做units.0 一样更改它。
这一切有必要吗?
是的。hostRequirements
type=bundle 上的第二个是必需的。在 Helios 中,除了翻译片段外,一个 IU 只能附加一个片段。通常,可以使用默认 IU 来设置所有 osgi 捆绑包的默认启动级别。为了选择我们的自定义片段而不是默认片段,它必须具有更高的“特异性”,即满足的主机要求的数量。
对于“安装”
units.0.instructions.install=installBundle(bundle:${artifact}); units.0.instructions.uninstall=uninstallBundle(bundle:${artifact});
instructions.install
和instructions.uninstall
指的是 p2 过程的阶段。installBundle
和uninstallBundle
指的是 OSGi 意义上的安装/卸载。必须先将捆绑包安装到 OSGi 系统中,然后才能执行任何其他操作。这基本上涉及将其添加到 config.ini 或 org.eclipse.equinox.simpleconfigurator/bundles.info 文件中。
大多数 p2 安装已经包含一个默认配置 IU,它将安装并设置捆绑包的默认启动级别 (4)。但是,目前每个包只能应用一个配置片段,因此当您像这样添加自己的配置片段时,默认值不再应用于您的包。
主机要求。可安装的单元片段页面仅描述了片段是什么,没有关于如何创建片段的参考。它在自定义元数据页面上被简要提及,但没有解释。
文档,在 wiki 上的p2 类别下有一堆东西。接触点说明上的页面可能很有趣。help.eclipse.org上有一些帮助,但总的来说,我认为这比有文档的要先进一些。