4

OSGi バンドルで RMI ベースのシステムを公開する必要があります。RMIクライアントの「バンドル」は、bndツールを使用してOSGiバンドルに変換したjarであり(ソースにアクセスできません)、少なくともEclipseではすべて問題ないようですが、接続しようとするとRMI サーバーで、ClassCastException がスローされます。おそらく、OSGi と RMI のどちらかが ClassLoader をおかしく使用するためです。

どうすればこれを解決できますか? RMI クライアント jar を「システム」バンドルとして使用している可能性がありますか?

スタック トレースは次のとおりです。

Blipnet OSGi サービスを開始しています...
com.blipsystems.blipnet.api.blipserver.BlipServerConnectionException: サーバーへの接続に問題がありました
    com.blipsystems.blipnet.api.core.blipserver.BlipServerConnectionAdapter で。(不明なソース)
    com.blipsystems.blipnet.api.core.blipserver.BlipServerConnectionAdapter で。(不明なソース)
    com.blipsystems.blipnet.api.blipserver.BlipServer.getConnection (不明なソース) で
    dk.itu.jingling.blipnetosgi.BlipnetConnectionService.setup (BlipnetConnectionService.java:28) で
    dk.itu.jingling.blipnetosgi.BlipnetConnectionService で。(BlipnetConnectionService.java:22)
    dk.itu.jingling.blipnetosgi.Activator.start (Activator.java:32) で
    org.apache.felix.framework.util.SecureAction$Actions.run(SecureAction.java:1235) で
    java.security.AccessController.doPrivileged(ネイティブメソッド)で
    org.apache.felix.framework.util.SecureAction.startActivator (SecureAction.java:658) で
    org.apache.felix.framework.Felix.activateBundle (Felix.java:1699) で
    org.apache.felix.framework.Felix.startBundle (Felix.java:1621) で
    org.apache.felix.framework.BundleImpl.start(BundleImpl.java:890) で
    org.apache.felix.framework.BundleImpl.start (BundleImpl.java:877) で
    org.apache.felix.fileinstall.internal.DirectoryWatcher.start (DirectoryWatcher.java:819) で
    org.apache.felix.fileinstall.internal.DirectoryWatcher.start (DirectoryWatcher.java:805) で
    org.apache.felix.fileinstall.internal.DirectoryWatcher.startAllBundles (DirectoryWatcher.java:798) で
    org.apache.felix.fileinstall.internal.DirectoryWatcher.run (DirectoryWatcher.java:299) で
原因: java.lang.ClassCastException: com.blipsystems.blipnet.blipserver.cms.NewApiHandler_Stub を com.blipsystems.blipnet.api.core.blipserver.RemoteBlipServerConnection にキャストできません
4

2 に答える 2

5

標準のJavaシリアル化とOSGiは、クラスの可視性の問題のためにうまく混合できません。また、RMIはシリアル化の上に構築されているため...

グーグルで検索すると、RMIとOSGiについて質問する人がたくさんいますが、具体的な解決策はほとんどありません。

私はRMIとOSGiの特定の問題を調査するために腰を下ろしていませんが、HTTPInvokerJavaのシリアル化メカニズムをまだ使用しているSpringの問題を解決しました。

問題は単一のクラスに帰着します:ObjectInputStream

これは逆シリアル化の責任者です-そしてオブジェクトを逆シリアル化するには、そのクラスの可視性が必要です。最新のIDEを使用している場合は、このクラスの継承階層を調べて、RMIに固有のいくつかのクラスを含む多くの拡張機能があることを確認できます。

私の解決策は、Springの拡張可能な実装を使用ObjectInputStreamし、バンドルからクラスローダーをプラグインすることでした。これにより、逆シリアル化により、クラスを表示できるクラスローダーにアクセスできるようになりました。

システムバンドルをいじることもできますが、それは本当にハックであり、長期間の使用にはお勧めしません。

残念ながら、OSGiにはまだいくつかの厄介なコーナーがあり、抽象化のレベルを掘り下げて問題を見つけて修正する必要があります。RMIはその1つです。

Paremusの連中は、RMI用のService Fabricサーバー製品(OSGiベースのサーバー)にソリューションがあり、Felixで動作するように構成できると主張しています(EclipseのEquinoxがデフォルトだと思います)。

于 2009-09-30T09:14:09.257 に答える