乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      如何解決java.lang.NoClassDefFoundError

       瞻云軒 2015-05-08
      如何解決NoClassDefFoundError--第二部分

      第一部分請看:http://vipcowrie./blog/1561291

      本文面向的是JAVA初學(xué)者,建議你們自己編譯和運(yùn)行例子程序。

      本文包含了NoClassDefFoundError的原因分析和例子程序,并且給出了建議的處理策略。

      NoClassDefFoundError 問題原因1:缺少jar包

      首先最常見的原因是classpath的配置問題。例子程序:

      本例子程序嘗試創(chuàng)建一個新的CallerClassA實(shí)例,然后執(zhí)行他的一個方法,此方法引用了類ReferencingClassA,本例子演示了classpath問題導(dǎo)致的NoClassDefFoundError ,本例子還打印了當(dāng)前的classloader chain的情況,以便進(jìn)一步的分析。這個打印信息對你以后分析此類問題也很有幫助的:

      程序
      Java代碼  收藏代碼
      1. public class NoClassDefFoundErrorSimulator {  
      2.         public static void main(String[] args) {  
      3.   
      4.                 System.out  
      5.                                 .println("java.lang.NoClassDefFoundError Simulator");  
      6.   
      7.                 // Print current Classloader context  
      8.   
      9.                 System.out.println("\nCurrent ClassLoader chain: "  
      10.                                 + ClassloaderUtil.getCurrentClassloaderDetail());  
      11.   
      12.                 // 1. Create a new instance of CallerClassA  
      13.   
      14.                 CallerClassA caller = new CallerClassA();  
      15.   
      16.                 // 2. Execute method of the caller  
      17.   
      18.                 caller.doSomething();  
      19.   
      20.                 System.out.println("done!");  
      21.   
      22.         }  
      23. }  



      Java代碼  收藏代碼
      1. public class CallerClassA {  
      2.         private final static String CLAZZ = CallerClassA.class.getName();  
      3.   
      4.         static {  
      5.   
      6.                 System.out.println("Classloading of " + CLAZZ + " in progress..."  
      7.                                 + ClassloaderUtil.getCurrentClassloaderDetail());  
      8.   
      9.         }  
      10.   
      11.         public CallerClassA() {  
      12.   
      13.                 System.out.println("Creating a new instance of "  
      14.                                 + CallerClassA.class.getName() + "...");  
      15.   
      16.         }  
      17.   
      18.         public void doSomething() {  
      19.   
      20.                 // Create a new instance of ReferencingClassA  
      21.   
      22.                 ReferencingClassA referencingClass = new ReferencingClassA();  
      23.   
      24.         }  
      25. }  


      Java代碼  收藏代碼
      1. public class ReferencingClassA {  
      2.   
      3.         private final static String CLAZZ = ReferencingClassA.class.getName();  
      4.   
      5.         static {  
      6.   
      7.                 System.out.println("Classloading of " + CLAZZ + " in progress..."  
      8.                                 + ClassloaderUtil.getCurrentClassloaderDetail());  
      9.   
      10.         }  
      11.   
      12.         public ReferencingClassA() {  
      13.   
      14.                 System.out.println("Creating a new instance of "  
      15.                                 + ReferencingClassA.class.getName() + "...");  
      16.                   
      17.                 Maps.newHashMap();  
      18.   
      19.         }  
      20.   
      21.         public void doSomething() {  
      22.   
      23.                 // nothing to do...  
      24.   
      25.         }  
      26. }  


      打印classloader工具類:

      Java代碼  收藏代碼
      1. public class ClassloaderUtil {  
      2.         public static String getCurrentClassloaderDetail() {  
      3.   
      4.                 StringBuffer classLoaderDetail = new StringBuffer();  
      5.   
      6.                 Stack<ClassLoader> classLoaderStack = new Stack<ClassLoader>();  
      7.   
      8.                 ClassLoader currentClassLoader = Thread.currentThread()  
      9.                                 .getContextClassLoader();  
      10.   
      11.                 classLoaderDetail  
      12.                                 .append("\n-----------------------------------------------------------------\n");  
      13.   
      14.                 // Build a Stack of the current ClassLoader chain  
      15.   
      16.                 while (currentClassLoader != null) {  
      17.   
      18.                         classLoaderStack.push(currentClassLoader);  
      19.   
      20.                         currentClassLoader = currentClassLoader.getParent();  
      21.   
      22.                 }  
      23.   
      24.                 // Print ClassLoader parent chain  
      25.   
      26.                 while (classLoaderStack.size() > 0) {  
      27.   
      28.                         ClassLoader classLoader = classLoaderStack.pop();  
      29.   
      30.                         // Print current  
      31.   
      32.                         classLoaderDetail.append(classLoader);  
      33.   
      34.                         if (classLoaderStack.size() > 0) {  
      35.   
      36.                                 classLoaderDetail.append("\n--- delegation ---\n");  
      37.   
      38.                         } else {  
      39.   
      40.                                 classLoaderDetail.append(" **Current ClassLoader**");  
      41.   
      42.                         }  
      43.   
      44.                 }  
      45.   
      46.                 classLoaderDetail  
      47.                                 .append("\n-----------------------------------------------------------------\n");  
      48.   
      49.                 return classLoaderDetail.toString();  
      50.   
      51.         }  
      52. }  


      正常運(yùn)行
      Java代碼  收藏代碼
      1. java -classpath .;../guava-12.0.jar NoClassDefFoundError.NoClassDefFoundErrorSimulator  
      2. java.lang.NoClassDefFoundError Simulator  
      3.   
      4. Current ClassLoader chain:  
      5. -----------------------------------------------------------------  
      6. sun.misc.Launcher$ExtClassLoader@addbf1  
      7. --- delegation ---  
      8. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      9. -----------------------------------------------------------------  
      10.   
      11. Classloading of NoClassDefFoundError.CallerClassA in progress...  
      12. -----------------------------------------------------------------  
      13. sun.misc.Launcher$ExtClassLoader@addbf1  
      14. --- delegation ---  
      15. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      16. -----------------------------------------------------------------  
      17.   
      18. Creating a new instance of NoClassDefFoundError.CallerClassA...  
      19. Classloading of NoClassDefFoundError.ReferencingClassA in progress...  
      20. -----------------------------------------------------------------  
      21. sun.misc.Launcher$ExtClassLoader@addbf1  
      22. --- delegation ---  
      23. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      24. -----------------------------------------------------------------  
      25.   
      26. Creating a new instance of NoClassDefFoundError.ReferencingClassA...  
      27. done!  



      異常重現(xiàn)
      Java代碼  收藏代碼
      1. java -classpath . NoClassDefFoundError.NoCl  
      2. java.lang.NoClassDefFoundError Simulator  
      3.   
      4. Current ClassLoader chain:  
      5. -----------------------------------------------------------------  
      6. sun.misc.Launcher$ExtClassLoader@addbf1  
      7. --- delegation ---  
      8. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      9. -----------------------------------------------------------------  
      10.   
      11. Classloading of NoClassDefFoundError.CallerClassA in progress...  
      12. -----------------------------------------------------------------  
      13. sun.misc.Launcher$ExtClassLoader@addbf1  
      14. --- delegation ---  
      15. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      16. -----------------------------------------------------------------  
      17.   
      18. Creating a new instance of NoClassDefFoundError.CallerClassA...  
      19. Classloading of NoClassDefFoundError.ReferencingClassA in progress...  
      20. -----------------------------------------------------------------  
      21. sun.misc.Launcher$ExtClassLoader@addbf1  
      22. --- delegation ---  
      23. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      24. -----------------------------------------------------------------  
      25.   
      26. Creating a new instance of NoClassDefFoundError.ReferencingClassA...  
      27. Exception in thread "main" java.lang.NoClassDefFoundError: com/google/common/collect/Maps  
      28.         at NoClassDefFoundError.ReferencingClassA.<init>(ReferencingClassA.java:28)  
      29.         at NoClassDefFoundError.CallerClassA.doSomething(CallerClassA.java:31)  
      30.         at NoClassDefFoundError.NoClassDefFoundErrorSimulator.main(NoClassDefFoundErrorSimulator.jav  
      31. Caused by: java.lang.ClassNotFoundException: com.google.common.collect.Maps  
      32.         at java.net.URLClassLoader$1.run(URLClassLoader.java:202)  
      33.         at java.security.AccessController.doPrivileged(Native Method)  
      34.         at java.net.URLClassLoader.findClass(URLClassLoader.java:190)  
      35.         at java.lang.ClassLoader.loadClass(ClassLoader.java:306)  
      36.         at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)  
      37.         at java.lang.ClassLoader.loadClass(ClassLoader.java:247)  
      38.         ... 3 more  


      發(fā)生了什么?當(dāng)你在classpath中不包含guava的引用的時候,由于ReferencingClassA在運(yùn)行期引用了此類,導(dǎo)致了classloader報告找不到此類,從而出現(xiàn)NoClassDefFoundError。

      classloader分析

      注意:
      Java代碼  收藏代碼
      1. Classloading of NoClassDefFoundError.CallerClassA in progress...  
      2. -----------------------------------------------------------------  
      3. sun.misc.Launcher$ExtClassLoader@addbf1  
      4. --- delegation ---  
      5. sun.misc.Launcher$AppClassLoader@19821f **Current ClassLoader**  
      6. -------------------------  


      sun.misc.Launcher$AppClassLoader是系統(tǒng)的classloader,負(fù)責(zé)根據(jù)classpath設(shè)置在啟動的時候加載應(yīng)用需要的class。

      sun.misc.Launcher$ExtClassLoader是擴(kuò)展classloader,負(fù)責(zé)從java_home/lib/etc以及其他使用java.ext.dirs配置的目錄從加載擴(kuò)展java class。

      從打印結(jié)果可以看出,sun.misc.Launcher$ExtClassLoader是系統(tǒng)classloader的實(shí)際父類。

      建議處理策略

      分析異常堆棧,找到缺少的java類名稱,在classpath中驗(yàn)證,確保編譯和運(yùn)行期都能找到此類。

        本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多