gpt4 book ai didi

java - NoClassDefFoundError的可能原因

转载 作者:行者123 更新时间:2023-12-02 09:24:14 26 4
gpt4 key购买 nike

我收到以下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

这看起来像是无法找到导致异常的同一个类。我还在 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>

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

另外,有人可以阐明“异常”和“由”引起的吗?我不太明白他们两个有什么关系。

最佳答案

使用函数初始化静态字段可能会导致难以发现NoClassDefFoundError

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

public class SomePanel extends Panel {
static int CALC_VALUE = ValueCalcUtils.calcValue();
...

...哪里

ValueCalcUtils.calcValue()

...抛出异常。

然后,当抛出异常时,会发生以下情况:

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

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

在 Wicket/Tomcat 情况下...

我在 Tomcat Web 服务器上的 Wicket 应用程序中遇到了这个问题。问题是,静态 Utils-Method 依赖于 WicketApplication.get()

在大多数情况下,当 Tomcat 尝试在启动时从 SessionStore 恢复旧 session 时,会导致所描述的问题。有时, session 包含相关面板的序列化实例。初始化面板类时出现异常,因为 Tomcat 启动时还不存在 WicketApplication。后来,我们的应用程序日志中出现了许多令人困惑的面板 NoClassDefFoundError,而且没有明显的原因。

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

希望这对某人有帮助。

关于java - NoClassDefFoundError的可能原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12606477/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com