3

ユーザーに公開するインターフェイスを (他の多くのクラスと共に) 含むサーブレット プロジェクトがあります。

ユーザーは、提供されたインターフェイスを実装する独自のクラスを (.class ファイルの形式で) コンパイルし、プロジェクトが認識しているフォルダーに配置できます。サーブレットが開始すると、URLClassLoader を使用して、そのフォルダー内のすべての .class ファイルをロードします。(そのため、ユーザーは特定のイベントに参加できます。)

私が知る限り、クラスファイルは適切に配置され、ロードされていますユーザーがコンパイルした .class ファイルをロードすると、ClassNotFoundException 例外がスローされますが、既にクラスパスにあるはずのインターフェイスについて不平を言っています。

Caused by: java.lang.ClassNotFoundException: com.company.project.OurInterface
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)

.class ファイルを動的にロードするとき、インターフェースが見つからない理由はありますか?

4

3 に答える 3

3

の親クラスローダーを指定していない可能性がありますURLClassLoader

アプリケーションのクラスローダーは、動的クラスローダーの親クラスローダーである必要があります。

ClassLoader dynamicClassLoader = 
    new URLClassLoader(..., OutInterface.class.getClassLoader());
于 2010-11-01T21:44:19.403 に答える
0

「動的クラス」パスからそのインターフェースをロードしようとしているからでしょうか?インターフェースもそこにドロップするとどうなりますか?

于 2010-11-01T21:41:00.667 に答える
0

おそらく、別のクラスローダーを使用しており、そのクラスローダーによってロードされたクラスが見つからないためです。

代わりに、これに SPI を使用することを検討しましたか? http://download.oracle.com/javase/1.4.2/docs/guide/jar/jar.html#Service%20Provider (古いリンクで申し訳ありませんが、アプローチは同じです。

于 2010-11-01T21:41:10.963 に答える