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

有什么问题吗?


当前回答

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

其他回答

我认为这里有个问题:

static {
    //code for loading properties from file
}

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

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

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

先决条件:

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

解决方案:

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

希望这能有所帮助。

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

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

import org.junit.runner.RunWith;

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

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

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