1

UrlClassLoaders についてお聞きしたいです。うまく機能するメインの .jar ファイルを作成します。ここで、フォルダーの 1 つからプラグインをロードできるようにしたいと考えています。フォルダー内の .jar ファイルが見つかり、その内部のクラス (名前、パス) を一覧表示できるようになるまで、私はそれを書きました。問題は、私が彼にそのクラスを見つけるように頼んだとき (そのインスタンスを作成するため)、次のようにメインの jar ファイルから継承するクラスが見つからないことです:

IN MAIN JAR:
-class Expansion { ... }

In a plugin jar:
-class ExpansionA extends MainJar.Expansion { ... }

そのため、UrlClassLoader に " ExpansionA " クラスを解決するように要求すると MainJar ではなくプラグイン jar で " Expansion " クラスが検索されますが、プラグイン jar には " Expansion "クラスがありません。リソースライブラリ...そしてdefineClassメソッド中にNoDefFoundForClassError例外をスローします。MainJar のクラスの後にチェックするように彼に指示するにはどうすればよいですか? (1つのクラスだけでなく、プラグインがMainJarから任意のクラスを継承できるようにしたい)。私を助けることができますか?

4

1 に答える 1

1

ClassLoaders には、ロード要求が最初に委任される親があります。作成している新しいクラスローダーがクラスにアクセスできるようにするExpansionには、 new の親をクラスの に設定する必要がClassLoaderありClassLoaderますExpansion

ClassLoader myLoader=newURLClassLoader(urls, Expansion.class.getClassLoader());

これにより、Expansionクラスが によって検出されることが保証されるだけmyLoaderでなく、同じ実行時クラスに解決されることも保証されます (親が最初に要求されるため)。これは、プラグイン jar にクラスのコピーが含まれている場合に重要です。

于 2014-01-16T17:37:31.620 に答える