java.lang.NoClassDefFoundError:无法初始化类XXX

public class PropHolder { public static Properties prop; static { //code for loading properties from file } } // Referencing the class somewhere else: Properties prop = PropHolder.prop; 

class PropHolder是我自己的一类。 该类驻留在主类的相同JAR文件中。 所以这不应该是因为classpath中缺less任何JAR。

当我通过jar tf myjarfile查看JAR文件时,可以看到列出的PropHolder.class

顺便说一句:代码在我的本地机器上运行良好。 但是,当我用一些脚本将它部署到Linux服务器上时无法工作。 所以我认为这不是代码的问题。 但是由于某种原因。 部署过程很难跟踪。

可能是什么问题呢?

我最好的select是这里有一个问题:

  static { //code for loading properties from file } 

它会出现一些未捕获的exception发生并传播到实际的ClassLoader试图加载类。 我们需要一个堆栈跟踪来确认。

无论是它或创buildPropHolder.prop静态variables时发生。

你得到一个java.lang.NoClassDefFoundError ,这并不意味着你的类是缺less的(在这种情况下,你会得到一个java.lang.ClassNotFoundException )。 当读取类时,ClassLoader在读取类定义时遇到错误。

把一个try / catch里面的静态初始化器,看看例外。 如果你在那里读了一些文件,它与你的本地环境有所不同,这很可能是问题的原因(也许文件无法find,没有权限等)。

NoClassDefFoundError并没有给出什么内部静态块内出错的线索。 在静态{…}初始化代码中总是有这样一个块:

 static { try { ... your init code here } catch (Throwable t) { LOG.error("Failure during static initialization", t); throw t; } } 

我有同样的例外,这是我如何解决这个问题:

前提条件:

1)Junit类(和testing),扩展了另一个类。

2)使用spring初始化ApplicationContext,即初始化项目。

3)Application的上下文在@Before方法中初始化

解:

从@BeforeClass方法初始化应用程序上下文,因为父类还需要一些从应用程序上下文中初始化的类。

希望这会有所帮助。

如上所述,这可能是一些事情。 在我的情况下,我有一个静态初始化variables,依赖于我的属性文件中缺less的条目。 添加缺less的条目到属性文件,问题解决了。

就在几天前,我遇到了和你一样的问题。 所有的代码在我的本地机器上运行良好,但是却发现错误(noclassdeffound&initialize)。 所以我张贴我的解决scheme,但我不知道为什么,我只是提出一个可能性。 我希望有人知道会解释这个。@ John Vint首先,我会告诉你我的问题。 我的代码有静态variables和静态块都。 当我第一次遇到这个问题时,我尝试了John Vint的解决scheme,并尝试去捕捉exception。 但是,我什么也没抓到。 所以我认为这是因为静态variables(但现在我知道它们是相同的东西),仍然没有发现。 所以,我试图findLinux机器和我的电脑之间的区别。 然后我发现这个问题只有在多个线程在一个进程中运行的时候才会发生(顺便说一句,linux机器有双核和双进程)。 这意味着如果有两个任务(两个都使用具有静态块或variables的代码)在同一个进程中运行,则会出错,但是如果它们运行在不同的进程中,则两者都可以。 在Linux机器上,我使用

 mvn -U clean test -Dtest=path 

运行一个任务,并且因为我的静态variables是启动一个容器(或者你可能初始化一个新的类加载器),所以它将一直保持到jvm停止,并且只有当一个进程中的所有任务停止时,jvm才会停止。 每个任务将启动一个新的容器(或类加载器),这使得混乱的jvm。 结果,错误发生了。 那么,如何解决呢? 我的解决scheme是添加一个新的命令到maven命令,并使每个任务到同一个容器。

 -Dxxx.version=xxxxx #sorry can't post more 

也许你已经解决了这个问题,但是仍然希望能够帮助那些遇到同样问题的人。

如果您正在开发Android项目,请确保您没有在任何Android类上调用任何静态方法。 我只使用JUnit + Mockito,所以也许其他一些框架可能会帮助你完全避免这个问题,我不确定。

我的问题是调用Uri.parse(uriString)作为unit testing的静态初始化的一部分。 Uri类是一个Android API,这就是为什么unit testing版本找不到它。 我改变这个值为null而一切都恢复正常。