【问题标题】:java.lang.NoClassDefFoundError only in particular conditionsjava.lang.NoClassDefFoundError 仅在特定条件下
【发布时间】:2016-04-14 22:44:59
【问题描述】:

我的问题是,当 B 类尝试使用 A.check() 时,我的执行由于 java.lang.NoClassDefFoundError 而停止。

这是我的班级配置。注意:这些类在同一个包中,我已经检查了 A.class 文件是否放置在它应该放在的位置。

public class A{
    // vars 

    // declare some public method

    public synchronized static boolean check(){
           //do stuff, log some info and return boolean
    }
}

public class B implements Runnable{
    public void run() {
        A.check();
    }
}

这是我的堆栈跟踪:

java.lang.NoClassDefFoundError: org/mypackage/A 在 org/mypackage.B.run() 在 java.lang.Thread.run(Thread.java:745) 引起:java.lang.ClassNotFoundException: org/mypackage.B 在 org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)

该项目非常大,并且在此调用之前多次使用 A 类没有任何问题,所以我认为这与类路径无关。请注意,这是软件最后一次调用的一部分,应该关闭所有内容。

此外,我有两个 maven 目标:第一个执行有问题的代码没有任何问题,而第二个每次都会出现此错误。

【问题讨论】:

  • 你能发布你提到的两个不同的 maven 目标吗?
  • 什么意思?它们是我作为 maven 插件插入的两个自定义目标。你需要那些插件的代码吗?
  • 确保你的类加载器是一样的
  • 您使用的是 Plexus 编译器插件吗?配置不一样吗?

标签: java multithreading maven


【解决方案1】:

所以我已经解决了我的问题,我在这里发布了解决方案,所以也许对其他人有用。

首先报错:java.lang.NoClassDefFoundError 这个错误与 ClassNotFoundException 完全不同,这是我浪费了很多时间的地方。

Java 中的 NoClassDefFoundError 在 JVM 无法在运行时找到在编译时可用的特定类时引发。例如,如果我们从一个访问类的任何成员的类调用方法,并且该类在运行时不可用,则 JVM 将抛出 NoClassDefFoundError。重要的是要了解这与 ClassNotFoundException 不同,后者仅在尝试在运行时加载类时出现,并且名称是在运行时提供的,而不是在编译时提供的。许多 Java 开发人员将这两个错误混合在一起并感到困惑。我在这里quote 一个非常有用的博客,我使用了。

因此,如果一个类在编译期间存在但在运行期间在 java 类路径中不可用,则以较短的方式出现 NoClassDefFoundError。

但是即使有了这些信息,问题仍然存在,直到我发现了谜团:可以将类置于可以编译但不能在运行时定位的状态的原因之一是,如果静态初始化失败(例如,在我的课堂上,我将一个静态变量作为字段实例化得很糟糕)。

所以记得检查你的初始化阶段,如果你的类中有静态变量,这可能是你的 java.lang.NoClassDefFoundError 的原因。

顺便说一句,我不明白为什么这种错误不会引发一些更有意义的错误,例如 java.lang.ExceptionInInitializerError 或类似的错误。

【讨论】:

  • 它确实为我节省了大量寻找解决方案的时间。谢谢!
  • @James 不客气,只是为答案投票,这样它对其他人也有用:)
【解决方案2】:

尝试通过运行来调试 maven 执行:mvn -X <your_goals>

查看您的 POM 文件会很有用。

【讨论】:

  • Yogesh_D 正确地指出了静态块,这个异常通常是由这些块中的类初始化失败引起的。我还建议通过将您的 POM 文件和受影响的类放入一个新项目并自行执行它们来隔离问题。
【解决方案3】:

如果您正在使用 spring mvc,并且您在 dispatche-servlet.xml 中为 Controller 类创建了 bean 条目。

例子:

<bean id="MyClass" class="com.aaps.myfolder.MyClass">
    <property name="methodNameResolver">
        <ref bean="methodNameResolver" />
    </property>
</bean>

如果未编译 MyClass.java 并且如果在项目文件夹的 classes 文件夹中没有生成类文件,那么它将显示 java.lang.NoClassDefFoundError。

因此,如果您正在使用 spring mvc,请检查 MyClass.class 是否在 classes 文件夹中创建。

【讨论】:

    【解决方案4】:

    A 类是否有在静态块中完成的任何操作。即使正在加载一个类并且静态块由于任何原因而失败,您也可以获得此异常。尝试进行日志记录,看看是否发生了这样的事情。

    【讨论】:

    • 正如您在我的代码示例中看到的,是的,我的 A 类有静态变量和静态方法
    • 所以要么添加日志记录,要么调试它,看看它是否因任何异常而失败。
    • @rakwaht Yogesh_D 谈论的是静态块,而不是变量或方法。
    • 正要评论@tak3shi 所说的,A 类中的静态块不是静态方法。另请注意,如果您有一些静态字段,并且这些引用的类具有任何静态块,则可能会发生相同的情况。
    • 对不起,我的错,没有任何涉及的类中没有静态块。
    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2021-05-17
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多