public class PropHolder {
  public static Properties prop;

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

// Referencing the class somewhere else:
Properties prop = PropHolder.prop;

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

当我通过JAR tf myjarfile查看JAR文件时,我可以看到propolder .class列在那里。

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

有什么问题吗?


当前回答

NoClassDefFoundError没有提供关于静态块内部发生了什么错误的太多线索。在static{…中总是有这样一个块是很好的实践。}初始化代码:

static {
  try {

    ... your init code here

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

其他回答

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

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

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

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

我认为这里有个问题:

static {
    //code for loading properties from file
}

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

要么是这样,要么是在创建propolder时发生的。道具静态变量。

NoClassDefFoundError没有提供关于静态块内部发生了什么错误的太多线索。在static{…中总是有这样一个块是很好的实践。}初始化代码:

static {
  try {

    ... your init code here

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

我有同样的异常-但只是在调试模式下运行, 这就是我解决问题的方法(在3天之后): 在构建中。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 

to:

public class MyAppClass  extends MultiDexApplication 

这就解决了问题。 希望这能帮助到一些人