【发布时间】:2011-09-16 14:42:27
【问题描述】:
我有实现 IAssembly 的类 Assembly。
我在启动应用程序时看到以下错误
Caused by: java.lang.IllegalAccessError: class <Assembly > cannot access its superinterface <IAssembly>
at java.lang.ClassLoader.defineClass1(Native Method)
汇编代码
class package.Assembly implements IAssembly {
}
组装
interface IAssembly { //note -this is not public, so uses default protected
}
Assembly 和 IAssembly 存在于两个不同的 jar 中。两个 jar 由不同的类加载器加载。 Assembly 类在子类加载器中加载,IAssembly 是父类。类加载器正在使用链接。
在正常情况下,这是有效的。当我在使用 cobertura 检测 jar 后运行我的应用程序时发生错误。没有仪器,一切正常。 cobertura 仪器会导致这样的错误吗?或者无论如何,这都是一个等待检测的错误,但使用 cobertura 时,该错误很快就会暴露出来。
通过将界面设为“公开”,错误就会消失。
【问题讨论】:
-
为什么需要使用不同的类加载器来加载 jar?您的应用程序是如何部署/运行的?通常最好将东西打包在一起(对于简单的应用程序)或通过 JNDI 和 RMI 之类的 EJB 访问。我会亲自把你的界面和你的类放在同一个罐子里。但这只是我。
-
对我来说,这条消息导致了类路径问题,其中包
package_example的定义如下:A/package_example/classA、B/package_example/classB。当然,A和B都必须在类路径中才能正常工作。
标签: java classloader cobertura