2016-03-18 5 views
1

Я использую AEM 5.6.1. Я получаю исключение из JAXB моего пакета, когда jax-b api 2.2.12 вручную устанавливается в консоли. Поскольку JAX-b (2.1.0) уже предоставляется внутри AEM с помощью следующего пакета. Это исключение не возникает, если 2.2.12 нет. Кроме того, если jax-b 2.2.12 установлен после моего пакета, никаких проблем вообще нет.Как заставить мой пакет OSGI игнорировать конфликтуемый пакет при разрешении зависимостей

Однако эта новая версия используется другой связкой, разработанной другим поставщиком. Поэтому я не могу удалить этот новый пакет из консоли felix.

Система расслоение, которая предоставляет оригинальные JAX-B 2.1.0

`<dependency> 
<groupId>org.apache.sling</groupId> 
<artifactId>org.apache.sling.fragment.xml</artifactId> 
<version>1.0.2</version> 
</dependency>` 

Мне было просто интересно, как я мог заставить мой сверток игнорировать ищет JAX-б 2.2.12 и принимать только системы по умолчанию 2.1.0 по некоторой конфигурации с использованием maven pom. В частности, в плагин maven bundle в POM.

метод Activate в моем классе ABC:

`@Activate 
public void activate(ComponentContext ctx) throws JAXBException { 
     abcContext = JAXBContext.newInstance(ABC.class); 
    }` 

Текущий Bundle определение пакета импорта плагин:

<Import-Package>        
         *;resolution:=optional 
        </Import-Package> 

Исключение:

16.03.2016 03:13:05.709 *ERROR* [Background Update foo.barsupport-bundle (606)] foo.barsupport-bundle [foo.bar.calendar.impl.CalendarEventParserImpl] The activate method has thrown an exception (javax.xml.bind.JAXBException 
- with linked exception: 
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory not found by cqse-httpservice [25]]) javax.xml.bind.JAXBException 
- with linked exception: 
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory not found by cqse-httpservice [25]] 
     at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:241) 
     at javax.xml.bind.ContextFinder.find(ContextFinder.java:477) 
     at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:656) 
     at javax.xml.bind.JAXBContext.newInstance(JAXBContext.java:599) 
     at foo.bar.integration.calendar.impl.CalendarEventParserImpl.activate(CalendarEventParserImpl.java:33). 

Любая помощь будет очень ценна.

ответ

2

В общем, ваша проблема заключается в том, что ваш комплект по умолчанию принимает [2.0, 3.0], который идеально подходит для Semantic Versioning (Major.Minor.BugFix). Но если ваш пакет использует новую версию, и если он связывается с некоторыми классами thoses с вашей каркасной структурой, которые используют более старую версию этого пакета, вы можете получить такое ClassNotFoundException в Runtime.

uses directive создан, чтобы убедиться, что если имеется несколько совместимых версий и несколько импортеров, эти импортеры будут связываться между ними с помощью той же версии. Обычно это происходит, когда пакет экспортирует пакеты, где другие пакеты импортируются другими. Вот почему хорошая практика состоит в том, чтобы иметь API-пакет, который не экспортирует ничего или пакет Impl, который ничего экспортирует, он освобождает вас от необходимости использования.

+0

Джонатан, Большое спасибо за подробное описание ситуация. – user3641136

1

Попробуйте использовать диапазон версий при импорте JAXB в вашей пачке:

<Import-Package> 
    javax.xml.bind;version="[2.1,2.2)"       
    *;resolution:=optional 
</Import-Package> 

Эта директива скажите OSGi распознаватель телеграфировать свой пакет с пакетом javax.xml.bind с версии от 2.1 до 2.2, 2.2 исключен.

+0

Спасибо за ответ. Я пробовал, но поскольку мой пакет неактивен, я изменил определение импорта на что-то вроде ниже, чтобы сделать его активным. Однако он по-прежнему выбирая JAX-б 2.2.12 :( – user3641136

+0

\t \t \t \t \t \t \t javax.xml.bind, версия = "[2.1,2.2)" \t \t \t \t \t \t \t! EDU.oswego.cs.dl.util.одновременно --------- ------- \t \t \t \t \t \t \t! org.apache.lucene. * \t \t \t \t \t \t \t! org.apache.sling.event .jobs \t \t \t \t \t \t \t! org.apache.xml.dtm \t \t \t \t \t \t \t! Org.apache.xml.utils \t \t \t \t \t \t \t! Org.apache.xpath \t \t \t \t \t \t \t! Org.apache.xpath. * \t \t \t \t \t \t \t! Орг .codehaus.groovy. * \t \t \t \t \t \t \t! Org.exolab.castor.xml \t \t \t \t \t \t \t! Sun.awt.image.codec \t \t \t \t \t \t \t! Sun.misc \t \t \t \t \t \t \t! Sun.security .provider \t \t \t \t \t \t \t * \t \t \t \t \t \t user3641136

+0

Если расслоение JAXB-2.2.12 экспортирует пакет, который вы хотите, с версией вы хотите, то, что является актуальной проблемой ?? –