我遇到的问题是,每次运行代码时都不会发生NoClassDefFoundError。它有时会发生。在某种程度上,我的意思是,在服务器中部署战争2-3次(.ie卸载早期的战争,现在安装然后开始新的战争),在特定的服务器调用(.ie用于特定的Web服务) ),使用下面给出的类 Util 的 generateHash 方法,我得到了类 TestJNIUtil 的NoclassDefFoundError。
因此,每次发生此错误时,我都必须停止java和服务器的所有服务,然后重新启动它们。由于此错误是随机发生的,我无法找到此问题背后的原因。
请帮我解决这个问题。
注意:在项目中使用Spring。
public class Util {
public static String generateHash(String a, String b) throws MyException{
logger.info("In generateHash()");
if(!StringUtil.isNullOrEmpty(a) && !StringUtil.isNullOrEmpty(b)){
String hash = TestJNIUtil.getHashCode(a, b);
logger.info("Inputs used a and b : " + a + " , " + b);
logger.info("HashCode Generated : " + hash);
logger.info("Out generateHash()");
return hash;
}
logger.info("Out generateHash()");
return null;
}
}
public class TestJNIUtil{
private static MyLogger logger = MyLoggingImpl.getLogger(TestJNI.class);
static {
logger.info("In static block to load DLL.");
String dllPath = System.getenv(MyConstants.JNI_LIB);
if(!StringUtil.isNullOrEmpty(dllPath)){
logger.info("Loading MyJni.dll & libeay32.dll from Classpath.");
libPath = System.getenv("JNI_LIB");
logger.info("Library Path Used for Jni: " + libPath);
System.load(libPath + "\\MyJni.dll");
logger.info("Loaded MyJni.dll Successfully.");
System.load(libPath + "\\libeay32.dll");
logger.info("Loaded libeay32.dll Successfully.");
}else{
logger.info("add JNI_LIB environment variable to load DLL.");
}
logger.info("Out static block to load DLL.");
}
public static String getHashCode(String a, String b)
throws MyException {
logger.info("In getHashCode().");
String hashCode = null;
try {
if (a and b are not null) {
// Call native code for hash code generation.
hashCode = MyJni.generateHash(a, b);
logger.info("Hash Code Generated : " + hashCode);
} else {
//throw MyException
}
} catch (MyException e) {
//log and then throw MyException
}
if (StringUtil.isNullOrEmpty(hashCode)) {
//log and then throw MyException
}
logger.info("Out getHashCode().");
return hashCode;
}
}
public class MyJNI {
public static native String generateHash(String a, String b);
}
答案 0 :(得分:1)
我已经看到了使用静态初始化程序和GlassFish服务器的战争部署的这种行为。与glassfish的类加载器有关。
我会从静态初始化程序中删除dll的加载,并可能将它放在Web应用程序的上下文初始化程序中。或者更好的是,我会为getHashCode方法添加更多智能,以便在它们不可用的情况下加载dll。