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

Leo*_*eon 154 java runtime jar noclassdeffounderror

public class PropHolder {
  public static Properties prop;

  static {
    //code for loading properties from file
  }
}

// Referencing the class somewhere else:
Properties prop = PropHolder.prop;
Run Code Online (Sandbox Code Playgroud)

class PropHolder是我自己的一类.该类驻留在主类的同一JAR文件中.所以这不应该因为类路径中缺少任何JAR.

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

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

可能是什么问题呢?

Joh*_*int 191

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

static {
    //code for loading properties from file
}
Run Code Online (Sandbox Code Playgroud)

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

创建PropHolder.prop静态变量时发生的那种情况.

  • 您需要确定从“static”块抛出什么异常。要调试它,请在整个块周围放置一个“try/catch(Exception e)”并记录异常。您必须修复该异常。通常,异常会被记录,但可能很难找到,因为它是在类加载期间记录的,这可能很早就发生 (3认同)
  • 由于与属性文件密钥名称不匹配并在我的代码中使用,我遇到了同样的问题。修复属性文件后问题得到解决 (2认同)

jeh*_*eha 117

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

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

  • 一个类可以加载另一个未找到的类.该实例中的原因仍然是ClassNotFoundException (3认同)

Mar*_*sen 30

NoClassDefFoundError没有提供关于静态块内部出错的线索.在静态{...}初始化代码中总是有这样的块是一个好习惯:

static {
  try {

    ... your init code here

  } catch (Throwable t) {
    LOG.error("Failure during static initialization", t);
    throw t;
  }
}
Run Code Online (Sandbox Code Playgroud)


Ker*_*nSi 5

我有同样的例外,这就是我解决问题的方法:

前提条件:

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

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

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

解决方案:

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

希望这会有所帮助。