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服务器上时就无法工作了。所以我认为这不是代码的问题。 但出于某种原因。部署过程很难跟踪。

有什么问题吗?


当前回答

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

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

其他回答

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

static {
  try {

    ... your init code here

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

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

先决条件:

Junit类(和test),它扩展了另一个类。 ApplicationContext使用spring初始化,初始化项目。 应用程序上下文在@Before方法中初始化

解决方案:

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

希望这能有所帮助。

我有同样的异常-但只是在调试模式下运行, 这就是我解决问题的方法(在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 

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

我认为这里有个问题:

static {
    //code for loading properties from file
}

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

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

如上所述,这可能是许多事情。在我的情况下,我有一个静态初始化的变量,它依赖于我的属性文件中缺少的条目。将缺失的条目添加到属性文件中,问题就解决了。