java.lang.NoClassDefFoundError仅在特定条件下

时间:2016-03-31 09:15:28

标签: java multithreading maven

我的问题是,当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:   组织/ mypackage的/ A   在org / mypackage.B.run()   在java.lang.Thread.run(Thread.java:745)   引起:java.lang.ClassNotFoundException:   组织/ mypackage.B    在org.codehaus.plexus.classworlds.strategy.SelfFirstStrategy.loadClass(SelfFirstStrategy.java:50)

该项目非常大,A类在此调用之前已经使用了很多次而没有任何问题,所以我认为这不是相对于类路径的东西。请注意,这是应该关闭所有内容的软件的最后一次调用的一部分。

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

但是即使有了这些信息,问题仍然存在,直到我发现了一个谜:可以将类置于可以编译但不在运行时的状态的原因之一是,如果你有静态初始化失败(例如,在我的班级中,我将字段作为一个非常实例化的静态变量。)

因此,如果您的类中有静态变量,请记住检查初始化阶段,这可能是您的java.lang.NoClassDefFoundError的原因。

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

答案 1 :(得分:0)

尝试运行:<Button x:Name="DeleteButton" Content="Delete" helpers:ToolBarHelper.TrackParentPanel="True"> <Button.Style> <Style BasedOn="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" TargetType="{x:Type Button}"> <Style.Triggers> <Trigger Property="helpers:ToolBarHelper.IsInOverflowPanel" Value="True"> <!-- The Overflow style setters --> </Trigger> </Style.Triggers> </Style> </Button.Style> </Button>

来调试maven执行

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

答案 2 :(得分:0)

如果您正在使用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&amp;如果在项目文件夹的classes文件夹中没有生成类文件,那么它将显示java.lang.NoClassDefFoundError。

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

答案 3 :(得分:0)

A类是否具有在静态块中完成的任何操作。即使正在加载类并且静态块因任何原因而失败,您也可以获得此异常。尝试记录以查看是否发生了类似的事情。