我们有一个在 OSGi 内部运行的框架。我们的其中一个捆绑包使用 ActiveMQ 进行基于 JMS 发布/订阅的通知。此捆绑包将 activemq jar 嵌入捆绑包中(私下)
捆绑类路径:., …… lib/activemq-all.jar, ……
所有这些在所有情况下都可以正常工作(除了一种情况 -嵌入情况)。
嵌入案例:现在我们正在处理应用程序嵌入我们的框架的场景。在其中一个嵌入应用程序开始使用其类路径中的 activemq 之前,这也可以正常工作。这个嵌入应用程序是一个基于 tomcat 的 webapp,并且在 tomcat 的 lib 中有 activemq-all.jar。
我们不会通过片段包导出与 active-mq 相关的任何内容,因此在 tomcat 类路径中对我们的包应该看不到 activemq 类,但它似乎正在发生。
引起:java.lang.ClassCastException: org.apache.activemq.transport.tcp.TcpTransportFactory 不能转换为 org.apache.activemq.transport.TransportFactory 在 org.apache.activemq.transport.TransportFactory.findTransportFactory(TransportFactory.java:201) ... 24 更多
我们尝试在创建 ActiveMQ 连接之前/之后设置/重置 ContextClassLoader,这似乎解决了这个问题,但破坏了很多其他东西(围绕我们使用的 Apache Tuscany SDO),所以它不是一个可行的选择。
问题:当完全断开连接时,ActiveMQ 类为什么会在应用程序类路径和捆绑类路径之间发生冲突?如何解决这个问题呢?