1

我们有一个在 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 类为什么会在应用程序类路径和捆绑类路径之间发生冲突?如何解决这个问题呢?

4

1 回答 1

1

因此,如果我理解正确,您可以从 Tomcat webapp 启动嵌入式 OSGi 框架,并且 Tomcat 类路径中的类现在在嵌入式 OSGi 环境中可见。

我想这取决于您为框架提供的类。对于 Felix(我不知道您使用的是哪个 OSGi 实现),您可以使用框架配置属性对其进行配置。

也许您的问题与和您的应用程序集有关:org.osgi.framework.bootdelegation=*

于 2012-05-13T09:21:48.017 回答