1

我正在使用 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).

任何帮助将非常感激。

4

2 回答 2

2

一般来说,您的问题是您的捆绑软件默认接受 [2.0, 3.0),这对于语义版本控制(Major.Minor.BugFix) 来说是完美的。但是,如果您的包使用较新的版本,并且如果它与使用该包的旧版本的框架中的一些类进行通信,您可以在运行时获得那种 ClassNotFoundException。

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

于 2016-03-18T14:20:35.360 回答
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。

于 2016-03-18T13:01:53.313 回答