8

現在、アプリケーションでの OneJar の使用を調査していますが (さまざまな理由から)、アプリケーションは多数のカスタム を使用してURLClassloaderアプリケーション拡張機能をロードしています。

「OneJar」Jar としてバンドルされると、ClassNotFound例外が発生します。問題のクラスはバンドルされた Jar に存在し、親子関係を解決するためにクラスローダー メカニズムに依存しているだけです。

あれは。interfaceバンドルされた Jar (親のクラスローダー コンテキスト内にある必要があります) に格納されている共通があります。拡張機能はこれを実装しinterface(拡張機能を呼び出すことができるようにする)、親クラスローダーのリソース検出機能を使用する子クラスローダーの機能に依存します。

これを経験した人はいますか、それを解決する方法について何か光を当てていますか.

他の同様のメカニズムに興味があります(ライブラリのJarを単一のJarリソースにバンドルするため、すべてを解凍してJarを単一のファイルにする必要はありません)

4

1 に答える 1

7

クラスローダーがどのように作成されたかについて、いくつかの仮定をしていることがわかりました。

クラスローダーは、そのクラスローダーを親として使用すると想定しました(つまり、getClass()。getClassLoader())が、そうではありませんでした。

代わりに、を使用していましたSystemClassLoader。これは、子クラスローダーが共有インターフェースを探しに行ったときに、それを見つけることができなかったことを意味します(SystemClassLoaderOneJarクラスローダーではなくを探していたため)。

CustomClassLoader.class.getClassLoader()カスタムクラスローダーのコンストラクターに追加することで、これを修正しました

于 2012-08-16T04:58:36.287 に答える