В Equinox Можно ли пометить пакет OSGi как запущенный из p2.inf, содержащего его функцию? - PullRequest
8 голосов
/ 20 июня 2010

У меня есть функция Eclipse, которая включает в себя несколько пакетов. Я хочу сказать p2 пометить один из этих пакетов как запущенный, когда функция установлена. Это возможно при использовании собственного пакета META-INF / p2.inf, например,

instructions.configure = markStarted(started: true)

но я хочу сделать это на уровне функций, а не на уровне пакета (рассматриваемый пакет является сторонним, и я предпочел бы не изменять его каким-либо образом, если это возможно).

Некоторые исследования привели меня к этому документу , в котором предполагается, что должна быть возможность перенести инструкции по конфигурированию в 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) ... ответы, касающиеся Гелиоса, также были бы очень полезны.

1 Ответ

9 голосов
/ 20 июня 2010

"единицы. #." Записи p2.inf создают новый устанавливаемый модуль , они не изменяют другие существующие IU.

В основном вам нужно создать целый Фрагмент устанавливаемого модуля . Фрагмент имеет соответствующие инструкции и прикрепляется к IU вашего комплекта. Затем вам нужно добавить требование из вашей функции в этот новый IU.

PDE / Build делает это автоматически при создании продуктов. Вы можете увидеть сгенерированный p2.inf, создав небольшую сборку продукта rcp, которая имеет начальный уровень для вашего пакета.
Сгенерированный 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

    Эти числа несколько произвольны, они служат только для отделения одного набора свойств (requires или units или любого другого) от другого. requires здесь использовал '2' просто потому, что я скопировал его из большого p2.inf, сгенерированного pde.build, и забыл изменить его так же, как я сделал unit.0.

  2. Все ли это необходимо?

    Да. Второй hostRequirements на наборе типа = необходим. В Helios, за исключением фрагментов перевода, только один фрагмент может быть присоединен к IU. Обычно доступен IU по умолчанию, который устанавливает начальный уровень по умолчанию для всех пакетов osgi. Для того чтобы наш пользовательский фрагмент был выбран по сравнению с фрагментом по умолчанию, он должен иметь более высокую «специфичность», то есть количество удовлетворенных требований к хосту.

    Для "установки"

    units.0.instructions.install = installBundle (расслоение: $ {артефакт}); units.0.instructions.uninstall = uninstallBundle (Bundle: $ {артефакт});

    instructions.install и instructions.uninstall относятся к фазам процесса p2. installBundle и uninstallBundle относятся к установке / удалению в смысле OSGi. Ваш пакет должен быть установлен в систему OSGi, прежде чем вы сможете сделать что-либо еще. Это в основном подразумевает добавление его в файлы config.ini или org.eclipse.equinox.simpleconfigurator / bundles.info.

    Большинство установок p2 уже содержат IU конфигурации по умолчанию, который устанавливает и устанавливает начальный уровень по умолчанию (4) для пакетов. Однако в настоящее время только один фрагмент конфигурации может быть применен к каждому пакету, поэтому при добавлении своего собственного подобного по умолчанию этот пакет больше не применяется к вашему пакету.

  3. hostRequirements. Страница фрагментов устанавливаемого модуля просто описывает, что такое фрагмент, без ссылки на то, как его создать. Это упомянуто на странице Настройка метаданных , но не объяснено.

    Документация, в вики есть куча вещей в категории p2 . страница с инструкциями touchpoint может быть интересной. Есть некоторая справка по help.eclipse.org , но в целом я думаю, что это немного более продвинуто, чем то, для чего есть документация.

...