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」にすると、エラーが消えます。
異なるクラスローダーを使用してjarをロードする必要があるのはなぜですか?アプリケーションはどのように展開/実行されていますか?通常は、単純なアプリケーションの場合は一緒にパッケージ化するか、EJBの場合はJNDIやRMIのようなものを介してアクセスするのが最善です。私は個人的にあなたのインターフェイスとあなたのクラスを同じ瓶に入れたいと思います。しかし、それは私だけです。 –
私にとって、このメッセージはclasspathの問題を引き起こしました。パッケージ 'package_example'は' A/package_example/classA'、 'B/package_example/classB'のように定義されていました。もちろん、これが動作するためには、クラスパスにAとBの両方がなければなりません。 –