1

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 クラスが競合するのはなぜですか? この問題を解決するには?

4

1 に答える 1

1

したがって、私の理解が正しければ、組み込み OSGi フレームワークを Tomcat Web アプリケーションから開始すると、Tomcat クラスパスのクラスが組み込み OSGi 環境内に表示されるようになります。

フレームワークに提供するクラスに依存すると思います。Felix の場合 (どの OSGi 実装を使用しているかはわかりません)、フレームワーク構成プロパティを使用して構成できます。

おそらくあなたの問題はこれとあなたのアプリケーションセットに関連しています:org.osgi.framework.bootdelegation=*

于 2012-05-13T09:21:48.017 に答える