NoClassDefFoundError的可能原因

que*_*ons 2 java ant jar build

我得到以下内容NoClassDefFoundError,这很奇怪,因为该类已经存在于库jar中.

Exception in thread "main" java.lang.NoClassDefFoundError: abc/test/Test.java
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:795)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:75)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:294)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:327)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at java.lang.ClassLoader.defineClass1(Native Method)
        at java.lang.ClassLoader.defineClass(ClassLoader.java:795)
        at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:144)
        at java.net.URLClassLoader.defineClass(URLClassLoader.java:382)
        at java.net.URLClassLoader.access$100(URLClassLoader.java:75)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:294)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:327)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:432)
Caused by: java.lang.ClassNotFoundException: abc.test.Test
        at java.net.URLClassLoader$1.run(URLClassLoader.java:299)
        at java.net.URLClassLoader$1.run(URLClassLoader.java:288)
        at java.security.AccessController.doPrivileged(Native Method)
        at java.net.URLClassLoader.findClass(URLClassLoader.java:287)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
        at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:327)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
        ... 25 more
Run Code Online (Sandbox Code Playgroud)

这看起来无法找到导致异常的同一个类.我还在ant中包含了库路径build.xml,可以在下面进行验证.

<property name="deps" value="${lib}/abclib/abclib-test.jar"/>

<target name="dist" depends="compile">
        <manifest file="${dist}/MANIFEST.MF">
            <attribute name="Main-Class" value="xyz.test.TestConfiguration" />
            <attribute name="Class-Path" value="${deps}"/>
        </manifest>
        <jar jarfile="${dist}/abc.jar" basedir="${build}/" manifest="${dist}/MANIFEST.MF" />
</target>
Run Code Online (Sandbox Code Playgroud)

我迷路了,有人至少可以指导我在哪里看,或者我可能做错了什么?

此外,有人可以抛光,"例外"和"引起".我不太明白他们两个如何相关.

fel*_*age 6

用函数初始化静态字段可能会导致难以揭开NoClassDefFoundError

示例:当您执行以下操作时:

public class SomePanel extends Panel {
    static int CALC_VALUE = ValueCalcUtils.calcValue();
    ...
Run Code Online (Sandbox Code Playgroud)

...在哪里

ValueCalcUtils.calcValue()
Run Code Online (Sandbox Code Playgroud)

...抛出异常。

然后,当抛出异常时,会发生这种情况:

  1. 将有一个错误指示实际问题ValueCalcUtils.calcValue()由于某种原因引发了异常)
  2. 随后每次尝试创建 的实例SomePanel都会抛出(误导性的)NoClassDefFoundErrorfor SomePanel

发生这种情况是因为 JVM 会记住SomePanel在他第一次尝试创建类定义时无法初始化,因此在再次询问时没有“没有类定义”( NoClassDefFoundError) SomePanel

在 Wicket/Tomcat 情况下......

我在 Tomcat-Webserver 上的 Wicket-Application 遇到了这个确切的问题。问题是,静态 Utils-Method 依赖于WicketApplication.get().

在大多数情况下这会起作用,当 Tomcat 尝试在启动时从 SessionStore 恢复旧会话时,它会导致所描述的问题。有时,会话包含相关小组的序列化实例。初始化 Panel-Class 时出现异常,因为在 Tomcat 启动时WicketApplication尚不存在。后来我们NoClassDefFoundError在我们的应用程序日志中有很多令人困惑的面板,没有明显的原因。

我们终于在 tomcat-stderror.log文件中找到了“root Error”的单一出现,因为它是 tomcat 在启动时抛出初始错误。

希望这可以帮助某人。


dav*_*son 5

对于另一个SO条目之间NoClassDefFoundError和之间的区别有一个非常好的解释:ClassNotFoundException

并不意味着......类不在CLASSPATH中.事实上,恰恰相反.这意味着Class ...是由ClassLoader找到的,但是在尝试加载类时,它会在读取类定义时遇到错误.当有问题的类具有静态块或使用ClassLoader未找到的类的成员时,通常会发生这种情况.所以要找到罪魁祸首,查看有问题的类的来源......并使用静态块或静态成员查找代码.

您需要查看Test.java的代码并找出它导入的内容并确保这些类在类路径上.如果需要帮助跟踪类,可以发布Test.java的代码.