我们有一个在OSGi中运行的框架。我们的一个捆绑包使用ActiveMQ进行基于JMS发布/订阅的通知。这个bundle将activemq jar嵌入bundle(私下)
Bundle-ClassPath: ., .... lib/activemq-all.jar, ....
所有这些在所有情况下都能正常工作(除了一种情况 - 嵌入案例)。
嵌入案例:现在我们正在处理应用程序嵌入框架的场景。这也很好,直到其中一个嵌入应用程序从其类路径开始使用activemq。这个嵌入式应用程序是一个基于tomcat的webapp,在tomcat的lib中有activemq-all.jar。
我们不会通过我们的片段包导出与active-mq相关的任何内容,所以在tomcat类路径中我们的bundle中不应该看到activemq类,但它似乎正在发生。
Caused by: java.lang.ClassCastException: org.apache.activemq.transport.tcp.TcpTransportFactory cannot be cast to org.apache.activemq.transport.TransportFactory at org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:201) ... 24 more
我们尝试在创建ActiveMQ连接之前/之后设置/重置ContextClassLoader,这似乎已经解决了这个问题,但打破了很多其他的东西(我们使用的Apache Tuscany SDO),所以它不是一个可行的选择。
问题: 为什么ActiveMQ类在完全断开连接时会在app classpath和bundle classpath之间发生冲突?如何解决这个问题?
答案 0 :(得分:1)
因此,如果我理解正确,您可以从Tomcat webapp启动嵌入式OSGi框架,现在可以在嵌入式OSGi环境中看到Tomcat类路径中的类。
我想这取决于你提供给框架的类。对于Felix(我不知道您正在使用哪个OSGi实现),您可以使用framework configuration properties对其进行配置。
也许您的问题与this和您的应用集相关:org.osgi.framework.bootdelegation=*