Как уже упоминалось, мы можем установить несколько наборов различных версий в OSGI. SO, если у меня есть две версии моего Bundle, и оба они активны. Как мой jsp узнает, какой пакет должен ссылаться?Как узнает Jsp, будет ли связываться с тем же именем, но с другой версией в cq5 или osgi?
ответ
Одним словом, вы не можете сделать это с помощью JSP. В AEM/Sling все JSP (фактически, все сценарии ресурсов) используют один загрузчик классов, и нет возможности указать версию импорта пакета. В результате, если у вас есть два пакета, экспортирующих один и тот же пакет с разными версиями (что обычно происходит в описанном вами сценарии), вы не можете знать, какая версия будет использоваться в ваших JSP. Я считаю, что в настоящее время это то, что экспортируется пакетом с наименьшим ID, но это никоим образом не гарантируется и от этого не должно зависеть.
Вам следует попытаться избежать этого сценария, уменьшив жесткую зависимость JSP от классов реализации Java и вместо этого используйте службы OSGi для того, что вы пытаетесь выполнить. С помощью услуг относительно легко выбрать конкретную реализацию службы с помощью фильтра.
Например, если несколько пучков имеют сервисы, зарегистрированные с интерфейсом com.myco.Foo
(и этот интерфейс экспортируются общей пачка) и каждая регистрационная служба имеют некоторые уникальный набор свойств (в моем примере это свойство называется type
, но это произвольное), вы можете сделать что-то вроде этого:
<%
Foo[] foos = sling.getService(Foo.class, "(type=something)");
if (foos != null && foos.length == 1) {
Foo foo = foos[0];
// do something with foo
}
%>
для каждого объявления пакета Import-Package, должен быть соответствующий Экспортно-пакет с таким же пакетом Пучки могут также прикрепить другие атрибуты пакетов импортирует или экспорта.
Для бывших: - Bundle-Name: Bundle A Import-Package: org.apache.foo; версия = "1.2.0"
Это означает, что Bundle-А имеет зависимость от пакета орг. apache.foo с минимальной версией 1.2.0. Хотя с OSGI вы можете указать диапазон версий, если вы не укажете диапазон, а скорее используете фиксированную версию, это приведет к значению «минимум» фиксированного значения. Если для этого же пакета есть более высокая версия, будет использоваться более высокая версия. Так Bundle-A не разрешит правильно, если не будет соответствующий пакет B, который экспортирует необходимый пакет
Bundle-Name: Bundle B Export-Package: org.apache.foo, версия = "1.2.0"
Обратите внимание, что обратное не относится к истине. Если Bundle B экспортирует версию 1.2.0, Bundle A не требуется указывать версию 1.2.0. Это потому, что импорт объявляет нужные им версии. Экспортированная версия ничего не указывает.
Вы можете проверить существующие версии ваших пучков в depfinder- «http://localhost: ****/система/консоль/depfinder»
В простой, мы можем сказать, JSP будет распознавать пакеты только через версию. Если есть две версии с похожим именем, она распознает последнюю версию. Связки, установленные сначала, используются для удовлетворения зависимости, когда найдено несколько пакетов с той же версией.