OSGi 内で実行されるフレームワークがあります。バンドルの 1 つは、JMS pub/sub ベースの通知に ActiveMQ を使用します。このバンドルは、activemq jar をバンドル内に (非公開で) 埋め込みます。
バンドル クラスパス: ., .... lib/activemq-all.jar、 ....
これはすべて、すべてのシナリオで正常に機能します (1 つのケース -埋め込みケースを除く)。
埋め込みケース:ここでは、アプリケーションがフレームワークを埋め込むシナリオを扱っています。埋め込みアプリケーションの 1 つがクラスパスから 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 クラスが競合するのはなぜですか? この問題を解決するには?