Java - Java类的NoClassDefinitionFoundError

时间:2015-09-07 03:29:54

标签: java dll static noclassdeffounderror

我遇到的问题是,每次运行代码时都不会发生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);
}

1 个答案:

答案 0 :(得分:1)

我已经看到了使用静态初始化程序和GlassFish服务器的战争部署的这种行为。与glassfish的类加载器有关。

我会从静态初始化程序中删除dll的加载,并可能将它放在Web应用程序的上下文初始化程序中。或者更好的是,我会为getHashCode方法添加更多智能,以便在它们不可用的情况下加载dll。