如何解决java.lang.NoClassDefFoundError--第二部分

2023-11-08

如何解决NoClassDefFoundError--第二部分 

第一部分请看: http://vipcowrie.iteye.com/blog/1561291  

本文面向的是JAVA初学者,建议你们自己编译和运行例子程序。 

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

NoClassDefFoundError 问题原因1:缺少jar包  

首先最常见的原因是classpath的配置问题。例子程序: 

本例子程序尝试创建一个新的CallerClassA实例,然后执行他的一个方法,此方法引用了类ReferencingClassA,本例子演示了classpath问题导致的NoClassDefFoundError ,本例子还打印了当前的classloader chain的情况,以便进一步的分析。这个打印信息对你以后分析此类问题也很有帮助的: 

程序 
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. }  


正常运行 : 
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!  



异常重现 : 
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  


发生了什么?当你在classpath中不包含guava的引用的时候,由于ReferencingClassA在运行期引用了此类,导致了classloader报告找不到此类,从而出现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是系统的classloader,负责根据classpath设置在启动的时候加载应用需要的class。 

sun.misc.Launcher$ExtClassLoader是扩展classloader,负责从java_home/lib/etc以及其他使用java.ext.dirs配置的目录从加载扩展java class。 

从打印结果可以看出,sun.misc.Launcher$ExtClassLoader是系统classloader的实际父类。 

建议处理策略  

分析异常堆栈,找到缺少的java类名称,在classpath中验证,确保编译和运行期都能找到此类。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解决java.lang.NoClassDefFoundError--第二部分 的相关文章

  • 更改启动 Java 运行时后 IntelliJ IDEA 无法在 Ubuntu 上启动

    之前 我的 IntelliJ 运行得很好 但我使用的是 java 6 所以我的项目无法使用 gradle 运行 我用命令将java切换到版本8sudo update alternatives config java 我检查了java ver
  • 中断并标签,“标签 MyLabel 丢失”

    我有这样的代码 if condition1 break MyLabel while true some code here MyLabel if condition2 break more code here 我收到此错误 标签 MyLab
  • Spring安全+LocaleResolver

    我需要在身份验证成功后更改区域设置 区域设置解析器
  • Hibernate 每个子类一个表继承策略的效率

    我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
  • Grails 项目 - Servlet 调用 - ClassNotFoundException:javax.servlet.AsyncContext

    我在用 IntelliJ IDEA 终极版 12 4 grails 2 2 0 BuildConfig groovy 文件中的 grails servlet version 2 5 并实现了简单的 servlet post 请求 使用 RE
  • 模式更新后 jOOQ 生成的类的运行时验证?

    我用org jooq util DefaultGenerator在构建过程中生成 jOOQ 类来表示我的数据库模式 当应用程序运行时 架构预计会在应用程序不知情的情况下发生更改 此类更改可能与已生成的代码兼容 也可能不兼容 如何在运行时检测
  • 如何将日期字符串解析为Date? [复制]

    这个问题在这里已经有答案了 如何将下面的日期字符串解析为Date object String target Thu Sep 28 20 29 30 JST 2000 DateFormat df new SimpleDateFormat E
  • NIO 直接缓冲区何时以及如何被释放?

    我有一个 C 库 需要一个临时缓冲区作为暂存空间 我正在考虑将直接字节缓冲区的地址传递给它 在最终释放缓冲区之前 是否允许虚拟机重新定位缓冲区 JNI 框架消失后 本机库将保留该指针 我的理解是 JNI 本地对象引用无法缓存 因为 VM 可
  • JTree ConvertValueToText 返回在更改时被截断

    我有一个自定义树实现convertValueToText 此实现取决于某些全局状态 如果返回的字符串比先前返回的字符串更长 实际上我认为更宽 因为以像素为单位触发它 则文本将被截断并用 填充 当重绘是由 取消 选择元素或某个元素引起时 情况
  • 为什么不自动装箱泛型的 Java 基本类型?

    Java 不允许在通用数据结构中使用原始类型 例如 不允许使用 ArrayList 原因是 原始类型不能直接转换为Object 然而 Java 1 5 确实支持自动装箱 并且包装类在通用数据结构中工作 那么为什么编译器不能将其自动装箱到 A
  • 合并和颜色样式不适用于 Apache POI excel 2003 格式

    在 Apache POI 中 我为某些单元格应用了一些样式并合并了这些单元格 当我在 2010 年或 2007 年打开时 它工作正常 但在 2003 年 格式样式消失了 每次保存 2003 Excel 文件之前都会弹出兼容性检查对话框 请参
  • 我可以使用 Selenium Webdriver 测试元素的顺序吗?

    有一个表单 其中有 3 个字段 具有 3 个不同的 ID fieldset div div fieldset
  • ThreadPoolExecutor 和队列

    我以为使用线程池执行器 http docs oracle com javase 6 docs api java util concurrent ThreadPoolExecutor html我们可以提交Runnables 要在以下位置执行B
  • 如何在 QueryDSL 中选择文字

    我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
  • 在 java 8 下使用泛型出现类型错误,但在 java 7 下则不然

    我有一段代码可以在 java 7 下编译良好 但不能在 java 8 下编译 这是一个独立的重现示例 我已经采用了显示此问题的真实代码并删除了所有实现 import java util Iterator class ASTNode
  • Java 声音可视化器

    我正在尝试制作一个java声音可视化工具 但我完全不知道如何在实时处理音频后立即从提取的音频中获取字节 我可以将程序与 wav 文件同步 但这不是我想要做的 我想用程序生成声音 然后播放它 而不将其保存在任何地方 谢谢您的帮助 本文可以帮助
  • java中永远不会出现的异常

    我为点和向量编写一个类 我想用它们来计算向量的点和范数 这些是点类和向量类 public class Point public float x y public class MyVector public Point start end 我
  • 在 Apache Servicemix 4 中的 OSGi 包之间共享配置文件?

    有人能够在 SMX4 中的两个或多个捆绑包之间成功共享配置吗 我正在寻找的是这样的 有一个文件 SMX HOME etc myconfiguration cfg 使此配置 可用 以便使用 Spring dm 通过 OSGi 配置管理将其注入
  • 如何从 Sublime Text 编辑器调试 Java 应用程序

    有时我正在对相当大的 Java 应用程序进行简单的修复 但我不想打开 Eclipse 来执行此任务 Eclipse 启动时间很长 并且由于该项目是由大量子项目构建的 而这些子项目无论如何都是由 Maven 构建的 因此需要很长时间才能使用
  • 如何在 Hibernate 中自动递增复合主键中的 Id?

    我有一个带有复合主键的表 groupId and batchId 实体类看起来像 Entity name EMPLOYEE public class Employee EmbeddedId private EmployeePK employ

随机推荐