【问题标题】:loadClass throws NoClassDefFoundError caused by ClassNotFoundExceptionloadClass 抛出由 ClassNotFoundException 引起的 NoClassDefFoundError
【发布时间】:2014-04-17 12:22:46
【问题描述】:

使用以下代码,我得到一个由 ClassNotFoundException 引起的 NoClassDefFoundError:

File file = new File( "C:\\prototype.core.bl.xmodelval.xmodel-1.0.0.jar" );
URL url = file.toURI().toURL();
URL[] urls = new URL[] { url };
ClassLoader cl = new URLClassLoader( urls );
Class cls = cl.loadClass("de.zeb.control.prototype.core.bl.xmodelval.xmodel.entity.EntityNameLengthXModelValidationRule" );

jar 和 jar 中的类绝对是可用的。 cl.loadClass 抛出以下异常。完整的异常堆栈跟踪如下:

Exception in thread "main" java.lang.NoClassDefFoundError: de/zeb/control/prototype/core/bl/xmodelval/XModelValidationRule
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:283)
    at java.net.URLClassLoader.access$000(URLClassLoader.java:58)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    at de.zeb.control.prototype.core.bl.xmodelval.jarwelfare.loader.XModelJarLoader.load(XModelJarLoader.java:32)
    at de.zeb.control.prototype.core.bl.xmodelval.jarwelfare.supplier.Runner.main(Runner.java:29)
Caused by: java.lang.ClassNotFoundException: de.zeb.control.prototype.core.bl.xmodelval.XModelValidationRule
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
    ... 24 more

ClassNotFoundException 的完整类名与 cl.loadClass 的名称不匹配,这对我来说似乎很奇怪。

感谢您的帮助。

【问题讨论】:

  • 这是一个令人费解的问题,因为在错误的类加载器中加载了类。但是,如果没有看到整个类加载器布局,很难说什么。
  • 看来,基本上,在加载 XModelValidationRule 类时,需要加载其他几个类来验证该类。其中一个类又引用了 XModelValidationRule,当它去寻找它时,XModelValidationRule 的类加载器不在类加载器链中,所以没有找到 XModelValidationRule。
  • 谢谢,它有效!正如您所说,问题是 XModelValidationRule 不在类路径上。添加包含该类的依赖项解决了问题。

标签: java noclassdeffounderror classnotfoundexception


【解决方案1】:

您可能需要提供父类加载器,否则您定义的类加载器将无法访问应用程序中已经存在的任何类。例如:

 ClassLoader cl = new URLClassLoader( urls , getClass().getClassLoader());

【讨论】:

  • 谢谢,但问题依旧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2014-10-25
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多