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

如何强制我的OSGI捆绑包在解析依赖项时忽略冲突的捆绑包,osgi,aem,apache-felix,maven-bundle-plugin,Osgi,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-b2.2.12安装在我的bundle之后,就不会有任何问题 然而,另一个由不同供应商开发的捆绑包正在使用这个新版本。因此,我无法从felix控制台中删除此新捆绑包 提供原始JAX-B2.1.0的系统包 `<dependency> <gro

我正在使用AEM 5.6.1。当在控制台中手动安装jax-b api 2.2.12时,JAXB my bundle出现异常。因为JAX-b(2.1.0)已经在AEM内部由以下捆绑包提供。当2.2.12不存在时,不会发生此异常。另外,如果jax-b2.2.12安装在我的bundle之后,就不会有任何问题

然而,另一个由不同供应商开发的捆绑包正在使用这个新版本。因此,我无法从felix控制台中删除此新捆绑包

提供原始JAX-B2.1.0的系统包

`<dependency>
<groupId>org.apache.sling</groupId>
<artifactId>org.apache.sling.fragment.xml</artifactId>
<version>1.0.2</version>
</dependency>`
当前捆绑插件导入包定义:

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

非常感谢您的帮助。

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

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

javax.xml.bind;version=“[2.1,2.2)”
*;分辨率:=可选

此指令告诉osgi解析器将包与包
javax.xml.bind
连接起来,包的版本从2.1到2.2,2.2不包括在内。

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


创建的目的是确保如果存在多个兼容版本和多个导入器,则这些导入器将使用相同版本在它们之间进行通信。这通常发生在一个包导出包时,而其他包是由其他包导入的。这就是为什么一个好的做法是使用API包,而该API包不会导出t任何东西或Impl bundle导出任何东西,它将您从使用的需要中解放出来。

感谢您的响应。我尝试过它,但由于我的bundle未处于活动状态,我已将导入定义更改为以下内容以使其处于活动状态。但是它仍然选择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.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编写,非常感谢您提供了对情况的详细了解。
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).
<Import-Package>
   javax.xml.bind;version="[2.1,2.2)"                          
   *;resolution:=optional
</Import-Package>