2011-09-16 15 views
4

IAssemblyを実装するクラスアセンブリがあります。IllegalAccessError:クラス<classname>はそのスーパーインターフェイス<interfacename>にアクセスできません

Iは、次のエラーアプリケーションを起動

Caused by: java.lang.IllegalAccessError: class <Assembly > cannot access its superinterface <IAssembly> 
     at java.lang.ClassLoader.defineClass1(Native Method) 

アセンブリコード

class package.Assembly implements IAssembly { 

} 

のiAssembly

interface IAssembly { //note -this is note public, so uses default protected 

} 

アセンブリとのiAssemblyは、2本の異なる瓶に存在する。参照

両方のジャーは異なるクラスローダーによってロードされます。 Assemblyクラスは子クラスローダーにロードされ、IAssemblyは親クラスにロードされます。クラスローダーは連鎖を使用しています。

通常の場合、これは機能します。このエラーは、coberturaを使用してjarファイルをインストゥルメントした後にアプリケーションを実行すると発生します。アウトインスツルメンテーションはすべて正常に動作します。 coberturaの計装がこのようなエラーを引き起こす可能性はありますか?またはこれはとにかく検出されるのを待っているエラーですが、coberturaでエラーがすぐに公開されます。

インターフェイスを「public」にすると、エラーが消えます。

+1

異なるクラスローダーを使用してjarをロードする必要があるのはなぜですか?アプリケーションはどのように展開/実行されていますか?通常は、単純なアプリケーションの場合は一緒にパッケージ化するか、EJBの場合はJNDIやRMIのようなものを介してアクセスするのが最善です。私は個人的にあなたのインターフェイスとあなたのクラスを同じ瓶に入れたいと思います。しかし、それは私だけです。 –

+0

私にとって、このメッセージはclasspathの問題を引き起こしました。パッケージ 'package_example'は' A/package_example/classA'、 'B/package_example/classB'のように定義されていました。もちろん、これが動作するためには、クラスパスにAとBの両方がなければなりません。 –

答えて

4

ローダーがチェーンされていても、インストルメンテーションと複数のクラスローダーでパッケージ保護が失敗するようです。 java.lang.instrument.Instrumentation上のこのjavadocを直接あなたのシナリオに関連するが、それは同様のシナリオを説明していません。

http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#appendToBootstrapClassLoaderSearch(java.util.jar.JarFile)を

はたぶんあなたのインストルメントクラスの検索されたローダーをチェックし、取得する方法があるかどうかを確認します同じクラスローダーからロードするにはAssemblyIAssemblyの両方が必要です。

1

あなたの問題は、IAssemblyの互換バージョンを使用していない可能性があります。したがって、クラスパス内にあっても、インターフェイスとその実装は一致しません。

クラスローダーの問題だった場合は、NoClassDefFoundErrorが返されます。

+0

各クラスには1つのバージョンしかありません。 – Jayan

関連する問題