2015-07-09 4 views
-1

Как уже упоминалось, мы можем установить несколько наборов различных версий в OSGI. SO, если у меня есть две версии моего Bundle, и оба они активны. Как мой jsp узнает, какой пакет должен ссылаться?Как узнает Jsp, будет ли связываться с тем же именем, но с другой версией в cq5 или osgi?

ответ

0

Одним словом, вы не можете сделать это с помощью 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 
    } 
%> 
0

для каждого объявления пакета 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 будет распознавать пакеты только через версию. Если есть две версии с похожим именем, она распознает последнюю версию. Связки, установленные сначала, используются для удовлетворения зависимости, когда найдено несколько пакетов с той же версией.