2015-09-07 142 views
0

我面對的問題是,每次運行代碼時都不會發生NoClassDefFoundError。它有時會發生。在某種程度上,我的意思是,在服務器上部署戰爭2-3次後(.ie卸載先前的戰爭,現在安裝然後開始新的戰爭),在特定的服務器上調用(.ie爲特定的Web服務),它使用generateHash類的方法Util給出下面,我得到這個類的NoclassDefFoundError TestJNIUtilJava - NoClassDefinitionFoundError for Java Class

所以每次出現此錯誤時,我不得不停止Java和服務器的所有服務,然後重新啓動again.Due他們隨機出現這個錯誤,我無法找到這個問題背後的原因。

請幫我解決這個問題。

注:春天在項目中使用。

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

都在同一個戰/罐的TestJNIUtil和的Util? –

+0

是的所有這一切都在同一場戰爭 –

回答

1

我已經看到這種類型的靜態初始化器和戰爭部署到GlassFish服務器的行爲。與glassfish的班加載器有關。

我會從靜態初始化刪除的DLL的加載,也許把它放在Web應用程序的情況下初始化。或者甚至更好,我會添加更多的智能getHashCode方法來加載DLL,以防它們不可用。

+1

不,我說的是根本不使用靜態方法。把你的代碼放在一個單獨的類中(即你可以單元測試它)的即時方法。然後在ServletContextListener中調用這個方法。喜歡的東西: 新TestJNIUtilLoader()loadDll()。 – chrisl08

+0

這也可能會有所幫助:http://stackoverflow.com/questions/6352215/java-why-java-lang-noclassdeffounderror-caused-by-static-field-initializ-failur?rq=1 – chrisl08