如何在解析依赖项时强制我的OSGI包忽略冲突的bundle

时间:2016-03-18 12:44:58

标签: osgi cq5 aem apache-felix maven-bundle-plugin

我正在使用AEM 5.6.1。当在控制台中手动安装jax-b api 2.2.12时,我正在使用JAXB my bundle获得异常。由于JAX-b(2.1.0)已在AEM内部通过以下捆绑提供。当2.2.12不存在时,不会发生此异常。另外,如果在我的捆绑后安装了jax-b 2.2.12,则完全没有问题。

然而,这个新版本正由另一个供应商开发的另一个捆绑包使用。因此,我无法从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-b 2.2.12并且只使用maven pom的某些配置来获取系统默认的2.1.0版本。特别是在POM中的maven bundle插件中。

激活我的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 个答案:

答案 0 :(得分:2)

一般情况下,您的问题是您的软件包默认接受[2.0,3.0],这对Semantic Versioning(Major.Minor.BugFix)来说是完美的。但是,如果您的bundle使用较新的版本,并且如果它与您的框架的某些类通信使用该版本的旧版本,那么您可以在运行时获得这种类的ClassNotFoundException。

创建uses directive是为了确保如果有多个兼容版本和多个导入程序,这些导入程序将使用相同版本在它们之间进行通信。它通常发生在bundle导出包由其他包导入的其他包时。这就是为什么一个好的做法是拥有不会导出任何东西的API包或者导出任何东西的Impl包,它可以让你免于使用......

答案 1 :(得分: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不包括在内。