【问题标题】:How to force my OSGI bundle to ignore a conflicted a bundle while resolving dependencies如何在解决依赖关系时强制我的 OSGI 包忽略冲突的包
【发布时间】:2016-07-05 05:30:38
【问题描述】:

我正在使用 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 插件中。

在我的 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).

任何帮助将不胜感激。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 乔纳森,非常感谢您提供有关情况的详细见解。
    【解决方案2】:

    在你的包中导入 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。

    【讨论】:

    • 感谢您的回复。我已经尝试过了,但由于我的包没有激活,我已经将导入定义更改为如下所示以使其激活。但是它仍在选择 jax-b 2.2.12 :(
    • javax.xml.bind;version="[2.1,2.2)" !EDU.oswego.cs.dl.util.concurrent --------- - ------ !org.apache.lucene.* !org.apache.sling.event.jobs !org.apache.xml.dtm !org.apache.xml.utils !org.apache.xpath !org.apache .xpath.* !org.codehaus.groovy.* !org.exolab.castor.xml !sun.awt.image.codec !sun.misc !sun.security.provider *
    • 如果捆绑包 jaxb-2.2.12 正在导出您想要的包,以及您想要的版本,那么实际问题是什么??
    • 打破语义版本控制可能不是最好的解决方案。
    • @Neil Bartlett,它在运行时给了我 ClassNotFoundException。我不确定它是如何工作的。由于 javax.xml.bind 正在由 jaxb-api-2.2.12.jar 以及 org.apache.sling.fragment.xml-1.0.2.jar 导出
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2012-02-16
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    相关资源
    最近更新 更多