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

How to force my OSGI bundle to ignore a conflicted a bundle while resolving dependencies

我正在使用 AEM 5.6.1。当在控制台中手动安装 jax-b api 2.2.12 时,我的 JAXB 包出现异常。由于 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 plugin 中。

我的ABC中的激活方法class:

`@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).

如有任何帮助,我们将不胜感激。

在您的包中导入 jaxb 时尝试使用版本范围:

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

此指令告诉 osgi 解析器将您的包与版本从 2.1 到 2.2 的包 javax.xml.bind 连接,排除 2.2。

一般来说,您的问题是您的捆绑包默认接受 [2.0, 3.0),这非常适合 Semantic Versioning (Major.Minor.BugFix)。但是,如果您的 bundle 使用较新的版本,并且如果它与那些 类 中的一些通信到使用该 bundle 的旧版本的框架,则您可以在运行时获得此类 ClassNotFoundException。

创建 uses directive 是为了确保如果有多个兼容版本和多个导入器,这些导入器将在它们之间使用 相同版本 进行通信。它通常发生在 bundle 导出包而其他包由其他包导入时。这就是为什么一个好的做法是使用不导出任何内容的 API 包或导出任何内容的 Impl 包,它使您无需使用..