我的问题是,当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目标:第一个执行质疑代码没有任何问题,而第二个每次都会出现此错误。
答案 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>
查看您的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类是否具有在静态块中完成的任何操作。即使正在加载类并且静态块因任何原因而失败,您也可以获得此异常。尝试记录以查看是否发生了类似的事情。