我正在使用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).
任何帮助都会非常感激。
答案 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不包括在内。