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

Posted

技术标签:

【中文标题】java.lang.NoClassDefFoundError:无法初始化类 XXX【英文标题】:java.lang.NoClassDefFoundError: Could not initialize class XXX 【发布时间】:2011-11-11 15:21:01 【问题描述】:
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 文件中。所以这不应该是因为类路径中缺少任何 JAR。

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

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

可能是什么问题?

【问题讨论】:

你的jar中的目录结构是否与类包相匹配? 需要查看一些来源,很多事情都可能导致这种情况。例如,一个“包”语句,但该文件实际上并未驻留在相应的路径中 一个原因是初始化时出现异常——是否还有其他错误输出? 【参考方案1】:

添加这些导入语句解决了这个问题:

import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。【参考方案2】:

我也有同样的异常——但只是在调试模式下运行时, 这就是我解决问题的方法(整整 3 天后): 在 build.gradle 我有: “multiDexEnabled true”设置在 defaultConfig 部分。

        defaultConfig 
    applicationId "com.xxx.yyy"
    minSdkVersion 15
    targetSdkVersion 28
    versionCode 5123
    versionName "5123"
    // Enabling multidex support.
    multiDexEnabled true

但显然这还不够。 但是当我改变时:

public class MyAppClass  extends Application 

到:

public class MyAppClass  extends MultiDexApplication 

这解决了它。 希望这会对某人有所帮助

【讨论】:

【参考方案3】:

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

static 
    //code for loading properties from file

它会出现一些未捕获的异常并传播到实际的 ClassLoader 试图加载类。不过,我们需要一个堆栈跟踪来确认这一点。

在创建 PropHolder.prop 静态变量时发生。

【讨论】:

我一次又一次地面临同样的问题。我确信这是因为static 问题。需要做些什么来解决问题? 您需要确定从static 块中抛出的异常。为了调试它,在整个块周围放置一个try/catch(Exception e) 并记录异常。您必须修复该异常。通常会记录异常,但可能很难找到,因为它是在类加载期间记录的,这可能很早就发生了 是的,我将代码保存在try catch 块中,上面写着Failed to initialize ClassA。我认为是JVM 的问题。我重新启动了系统,然后一切正常。以后如何在不重新启动系统的情况下解决此问题并通过简单的解决方案解决此问题。 @chance 没错。每个 Java 类加载只执行一次静态诱饵,对于大多数应用程序来说,每个应用程序运行一次。你需要像FileChangedReloadingStrategy 这样的东西。 Java还引入了WatchService 由于与属性文件键名不匹配并在我的代码中使用,我遇到了同样的问题。修复属性文件问题后得到解决【参考方案4】:

我遇到了同样的异常,这就是我解决问题的方法:

前提条件:

    Junit 类(和测试),扩展了另一个类。

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

    应用程序上下文在 @Before 方法中初始化

解决方案:

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

希望这会有所帮助。

【讨论】:

【参考方案5】:

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

我的问题是调用 Uri.parse(uriString) 作为单元测试的静态初始化程序的一部分。 Uri 类是一个 Android API,这就是单元测试构建找不到它的原因。我将这个值改为null,然后一切恢复正常。

【讨论】:

【参考方案6】:

就在几天前,我遇到了和你一样的问题。所有代码在我的本地机器上运行良好,但结果是错误(noclassdeffound&initialize)。 所以我发布了我的解决方案,但我不知道为什么,我只是提出了一种可能性。我希望有人知道会解释这一点。@John Vint 首先,我将向您展示我的问题。我的代码有静态变量和静态块。当我第一次遇到这个问题时,我尝试了 John Vint 的解决方案,并试图捕获异常。然而,我什么也没抓到。所以我认为是因为静态变量(但现在我知道它们是同一个东西)而仍然一无所获。 所以,我试着找出linux机器和我的电脑之间的区别。然后我发现只有在一个进程中运行多个线程时才会出现这个问题(顺便说一下,linux机器是双核双进程)。这意味着如果有两个任务(都使用具有静态块或变量的代码)在同一个进程中运行,它会出错,但如果它们在不同的进程中运行,它们都可以。 在Linux机器上,我使用

mvn -U clean  test -Dtest=path 

运行一个任务,因为我的静态变量是启动一个容器(或者你可能初始化一个新的类加载器),所以它会一直停留到jvm停止,并且jvm只有在一个进程中的所有任务都停止时才会停止.每个任务都会启动一个新的容器(或类加载器),这会使 jvm 感到困惑。结果,发生错误。 那么,如何解决呢?我的解决方案是在 maven 命令中添加一个新命令,让每个任务都转到同一个容器中。

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

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

【讨论】:

还有,代码在linux机器上运行时,按照上面的错误,还有一个问题:java.lang.ExceptionInInitializerError: null,表示在类加载器中找不到类,或者没有知道加载哪个(我猜)。你遇到了吗?【参考方案7】:

如上所述,这可能涉及很多方面。就我而言,我有一个静态初始化的变量,它依赖于我的属性文件中缺少的条目。将缺少的条目添加到属性文件中,问题就解决了。

【讨论】:

【参考方案8】:

NoClassDefFoundError 并没有提供太多关于静态块内部出了什么问题的线索。在 static ... 初始化代码中始终包含这样的块是一种很好的做法:

static 
  try 

    ... your init code here

   catch (Throwable t) 
    LOG.error("Failure during static initialization", t);
    throw t;
  

【讨论】:

如何在 kotlin 中做到这一点? 感谢您的提示。就我而言,我在静态线路初始化时获得了 NPE。【参考方案9】:

你得到一个java.lang.NoClassDefFoundError,这并不意味着你的班级不见了(在这种情况下你会得到一个java.lang.ClassNotFoundException)。尝试读取类时,ClassLoader 在读取类定义时遇到错误。

在您的静态初始化程序中放置一个 try/catch 并查看异常。如果您在那里读取了一些文件并且它与您的本地环境不同,则很可能是问题的原因(可能找不到文件,没有权限等)。

【讨论】:

一个澄清是,即使 NoClassDefFoundError 并不意味着 ClassNotFoundException,它仍然是 NoClassDefFoundError 的可能原因。 buf 如果您有 ClassNotFoundException 那么 ClassLoader 将/永远不会尝试加载该类,对吧? 一个类可能正在加载另一个未找到的类。该实例中的原因仍然是 ClassNotFoundException 我应该澄清一下,我只是说一个异常。getCause() 这个在这里真的很有帮助,因为我花了大约 20 分钟来验证 JAR(报告的类属于)是否包含在内。一旦我意识到我正在寻找错误的方向,我很容易理解可能缺少一些注释类,瞧,报告的一个被声明为@Stateless,所以我只是添加了相应的依赖项并能够继续进行。感谢您的提示!

以上是关于java.lang.NoClassDefFoundError:无法初始化类 XXX的主要内容,如果未能解决你的问题,请参考以下文章