java.lang.NoClassDefFoundError:如何解决–第2部分

本文是我们的NoClassDefFoundError故障排除系列的第2部分。 看一下第1部分 。 它将重点介绍最简单的NoClassDefFoundError问题类型。 本文对于Java初学者来说是理想的选择,我强烈建议您自己编译并运行示例Java程序。

今后将使用以下书写格式,并为您提供:
–问题案例的描述和NoClassDefFoundError的类型
–示例Java程序“模拟”问题情况 – ClassLoader链视图 –建议和解决策略

NoClassDefFoundError问题案例1 –缺少JAR文件

我们将介绍的第一个问题案例与Java程序包装和/或类路径问题有关。 典型的Java程序可以包含一个或多个在编译时创建的JAR文件。 当您忘记添加包含Java或Java EE应用程序引用的Java类的JAR文件时,通常会观察到NoClassDefFoundError。

一旦您分析了Java异常并缺少Java类名,通常就不难解决这种类型的问题。

示例Java程序

以下简单的Java程序按以下方式拆分:
–主Java程序NoClassDefFoundErrorSimulator
–调用者Java类CallerClassA –引用Java类ReferencingClassA –用于ClassLoader和日志记录相关设施的util类JavaEETrainingUtil

这个程序很简单,它试图创建一个新实例并执行一个Java类CallerClassA的方法,该方法引用了ReferencingClassA类。 它将演示一个简单的类路径问题如何触发NoClassDefFoundError。 该程序还在类加载时显示当前类加载器链的详细信息,以帮助您跟踪此过程。 当处理更大的类加载器链时,这对于将来和更复杂的问题案例特别有用。

package org.ph.javaee.training1;import org.ph.javaee.training.util.JavaEETrainingUtil;/*** NoClassDefFoundErrorTraining1* @author Pierre-Hugues Charbonneau**/
public class NoClassDefFoundErrorSimulator {/*** @param args*/public static void main(String[] args) {System.out.println("java.lang.NoClassDefFoundError Simulator - Training 1");System.out.println("Author: Pierre-Hugues Charbonneau");System.out.println("http://javaeesupportpatterns.blogspot.com");// Print current Classloader contextSystem.out.println("\nCurrent ClassLoader chain: "+JavaEETrainingUtil.getCurrentClassloaderDetail());// 1. Create a new instance of CallerClassACallerClassA caller = new CallerClassA();// 2. Execute method of the callercaller.doSomething();System.out.println("done!");}
}
package org.ph.javaee.training1;import org.ph.javaee.training.util.JavaEETrainingUtil;/*** CallerClassA* @author Pierre-Hugues Charbonneau**/
public class CallerClassA {private final static String CLAZZ = CallerClassA.class.getName();static {System.out.println("Classloading of "+CLAZZ+" in progress..."+JavaEETrainingUtil.getCurrentClassloaderDetail());}public CallerClassA() {System.out.println("Creating a new instance of "+CallerClassA.class.getName()+"...");}public void doSomething() {// Create a new instance of ReferencingClassAReferencingClassA referencingClass = new ReferencingClassA();             }
}
package org.ph.javaee.training1;import org.ph.javaee.training.util.JavaEETrainingUtil;/*** ReferencingClassA* @author Pierre-Hugues Charbonneau**/
public class ReferencingClassA {private final static String CLAZZ = ReferencingClassA.class.getName();static {System.out.println("Classloading of "+CLAZZ+" in progress..."+JavaEETrainingUtil.getCurrentClassloaderDetail());}public ReferencingClassA() {System.out.println("Creating a new instance of "+ReferencingClassA.class.getName()+"...");}public void doSomething() {//nothing to do...}
}
package org.ph.javaee.training.util;import java.util.Stack;
import java.lang.ClassLoader;/*** JavaEETrainingUtil* @author Pierre-Hugues Charbonneau**/
public class JavaEETrainingUtil {/*** getCurrentClassloaderDetail* @return*/public static String getCurrentClassloaderDetail() {StringBuffer classLoaderDetail = new StringBuffer();       Stack<ClassLoader> classLoaderStack = new Stack<ClassLoader>();ClassLoader currentClassLoader = Thread.currentThread().getContextClassLoader();classLoaderDetail.append("\n-----------------------------------------------------------------\n");// Build a Stack of the current ClassLoader chainwhile (currentClassLoader != null) {classLoaderStack.push(currentClassLoader);currentClassLoader = currentClassLoader.getParent();}// Print ClassLoader parent chainwhile(classLoaderStack.size() > 0) {ClassLoader classLoader = classLoaderStack.pop();// Print current                     classLoaderDetail.append(classLoader);if (classLoaderStack.size() > 0) {classLoaderDetail.append("\n--- delegation ---\n");                               } else {classLoaderDetail.append(" **Current ClassLoader**");}}classLoaderDetail.append("\n-----------------------------------------------------------------\n");return classLoaderDetail.toString();}
}

问题重现

为了重现该问题,我们将简单地“自愿”从包含引用Java类ReferencingClassA的类路径中省略其中一个JAR文件。

Java程序的包装如下:
– MainProgram.jar(包含NoClassDefFoundErrorSimulator.class和JavaEETrainingUtil.class)
-CallerClassA.jar(包含CallerClassA.class) – ReferencingClassA.jar(包含ReferencingClassA.class)

现在,让我们按原样运行程序:

建议和解决策略

##基准(正常执行)

..\bin>java -classpath CallerClassA.jar;ReferencingClassA.jar;MainProgram.jar org.ph.javaee.training1.NoClassDefFoundErrorSimulatorjava.lang.NoClassDefFoundError Simulator - Training 1
Author: Pierre-Hugues Charbonneau
http://javaeesupportpatterns.blogspot.comCurrent ClassLoader chain:
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader@17c1e333
--- delegation ---
sun.misc.Launcher$AppClassLoader@214c4ac9 **Current ClassLoader**
-----------------------------------------------------------------Classloading of org.ph.javaee.training1.CallerClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader@17c1e333
--- delegation ---
sun.misc.Launcher$AppClassLoader@214c4ac9 **Current ClassLoader**
-----------------------------------------------------------------Creating a new instance of org.ph.javaee.training1.CallerClassA...
Classloading of org.ph.javaee.training1.ReferencingClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader@17c1e333
--- delegation ---
sun.misc.Launcher$AppClassLoader@214c4ac9 **Current ClassLoader**
-----------------------------------------------------------------Creating a new instance of org.ph.javaee.training1.ReferencingClassA...
done!

发生了什么? 删除包含ReferencingClassA的ReferencingClassA.jar确实阻止了当前类加载器在运行时定位此引用Java类,从而导致ClassNotFoundException和NoClassDefFoundError。

如果您从Java启动类路径中或Java EE相关应用程序的EAR / WAR中省略JAR文件,这将是典型的异常。

ClassLoader视图

现在,让我们回顾一下ClassLoader链,以便您可以正确地了解这种问题情况。 从Java程序输出日志记录中可以看到,找到了以下Java ClassLoader:

Classloading of org.ph.javaee.training1.CallerClassA in progress...
-----------------------------------------------------------------
sun.misc.Launcher$ExtClassLoader@17c1e333
--- delegation ---
sun.misc.Launcher$AppClassLoader@214c4ac9 **Current ClassLoader**
-----------------------------------------------------------------

**请注意,Java引导类加载器负责加载核心JDK类,并以本机代码编写**

## sun.misc.Launcher $ AppClassLoader

这是系统类加载器,负责加载在启动时指定的Java类路径中找到的应用程序代码。

## sun.misc.Launcher $ ExtClassLoader

这是扩展类加载器,负责将代码加载到扩展目录(<java_home> / lib / ext或java.ext.dirs系统属性指定的任何其他目录)中。

从Java程序日志输出中可以看到,扩展类加载器是系统类加载器的实际超级父级。 我们的示例Java程序是在系统类加载器级别加载的。 请注意,对于这种问题情况,该类加载器链非常简单,因为我们此时尚未创建子类加载器。 这将在以后的文章中介绍。

建议和解决策略

现在在下面找到我对NoClassDefFoundError问题案例1的建议和解决策略:

–检查java.lang.NoClassDefFoundError错误并确定缺少的Java类
-在编译/构建环境中验证并找到丢失的Java类
-确定缺少的Java类是来自应用程序代码,第三方API还是Java EE容器本身。 验证预期在哪里找到丢失的JAR文件 –找到后,验证您的运行时环境Java类路径是否存在任何拼写错误或丢失的JAR文件 –如果问题是由Java EE应用程序触发的,请执行与上述相同的步骤,但请验证EAR / WAR文件的包装是否缺少JAR和其他库文件依赖项(如MANIFEST)。

请随时发表任何问题或评论。 第3部分将很快上市。

参考: java.lang.NoClassDefFoundError:如何解决–第2部分,来自我们的JCG合作伙伴 Pierre-Hugues Charbonneau,位于Java EE支持模式和Java教程博客。


翻译自: https://www.javacodegeeks.com/2012/06/this-article-is-part-2-of-our.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/372644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android开发技术周报 Issue#34

教程 Google Develop for Android 系列 前几天在G上看到Google Developers站点&#xff0c;有一个Android系列的文章&#xff0c;分享到个人微博&#xff0c;周末闲来没事就学写了下&#xff0c;把它们简单的翻译了下&#xff0c;没想到一发不可收拾&#xff0c;六篇文章全部都…

php进度条插件,分享8款优秀的 jQuery 加载动画和进度条插件_jquery

加载动画和进度条在网站和 Web 应用中的使用非常流行。虽然网速越来越快&#xff0c;但是我们的网站越来越复杂&#xff0c;同时用户对网站的使用体验的要求也越来越高。在内容加载缓慢的时候&#xff0c;使用时尚的加载动画和进度条告诉用户还有内容正在加载是一种非常好的方式…

卷积神经网络(CNN)与特殊的卷积

各种卷积操作的可视化的显示形式&#xff1a;GitHub - vdumoulin/conv_arithmetic: A technical report on convolution arithmetic in the context of deep learning1. fractionally-strided 卷积 如上图示&#xff0c;输入为 33 &#xff0c;想要卷积上采样成 55 的输出。需要…

JBoss AS 7:自定义登录模块

JBoss AS 7很整洁&#xff0c;但是仍然缺少文档&#xff08;错误消息没有那么有用&#xff09;。 这篇文章总结了如何创建自己的兼容JavaEE的登录模块&#xff0c;以对部署在JBoss AS上的Web应用程序的用户进行身份验证。 提供了一个工作的基本用户名密码模块。 为什么要使用Ja…

MySQL安装步骤及相关问题解决

1. 下载MySQL Server&#xff0c;网址&#xff1a;http://dev.mysql.com/downloads/mysql/ 2. 点击MySQL5.5.21的安装文件&#xff0c;出现安装向导界面&#xff0c;单击“next”继续安装&#xff1a; 3. 选择接受协议&#xff0c;单击“next”继续安装&#xff1a; 4. 在出现选…

matlab的数学函数,matlab中常见数学函数的使用

matlab中常见数学函数的使用 MATLAB 基本知识 Matlab 的内部常数 pi 圆周率 exp(1) 自然对数的底数 e i 或 j 虚数单位 Inf 或 inf 无穷大 Matlab 的常用内部数学函数 指数函数 exp(x) 以 e 为底数 log(x) 自然对数&#xff0c;即以 e 为底数的对数 log10(x) 常用对数&#xff…

C++中 list与vector的区别

C中 list与vector的区别 引用http://www.cnblogs.com/shijingjing07/p/5587719.html C vector和list的区别 1.vector数据结构vector和数组类似&#xff0c;拥有一段连续的内存空间&#xff0c;并且起始地址不变。因此能高效的进行随机存取&#xff0c;时间复杂度为o(1);但因为内…

使用Struts 2的查询网格(无插件)

当将jQuery与struts 2一起使用时&#xff0c;开发人员被说服使用struts2-jQuery插件 。 因为大多数论坛和其他Internet资源都支持struts2 jQuery插件。我有这种经验。 我想将Struts 2使用jQuery Grid插件&#xff0c;但不使用struts2 jQuery插件。 对于我而言&#xff0c;很难找…

php reflectionmethod,PHP ReflectionMethod getClosure()用法及代码示例

ReflectionMethod::getClosure()函数是PHP中的一个内置函数&#xff0c;用于为该方法返回动态创建的闭包&#xff0c;否则&#xff0c;在出现错误的情况下返回NULL。用法:Closure ReflectionMethod::getClosure ( $object )参数&#xff1a;该函数接受参数对象&#xff0c;该参…

java学习笔记--IO流

第十二章大纲&#xff1a; I/O input/output 输入/输出 一、创建文件&#xff0c;借助File类来实现 file.createNewFile() &#xff1a; 创建文件 file.exists() &#xff1a; 判断文件是否存在&#xff0c;如果存在&#xff0c;则返回true delete() &#xff1a; 删除文件&…

linux命令之kill篇

作业四&#xff1a;查询firewall进程&#xff0c;然后杀死 [rootlocalhost 桌面]# ps -aux |grep firewall root 772 0.0 2.0 327912 20704 ? Ssl 15:23 0:00 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid root 5323 0.0 0.0 112660…

ActiveMQ网络连接器

这篇文章对我和任何对网络连接器如何为ActiveMQ工作感兴趣的ActiveMQ贡献者而言都是更多的内容。 我最近花了一些时间查看代码&#xff0c;并认为最好画一些快速的图表来帮助我记住我学到的东西&#xff0c;并在将来发现问题时帮助将来确定在哪里进行调试。 如果我输入有误&…

《程序设计与数据结构》第3周学习总结

学号 20162317 《程序设计与数据结构》第3周学习总结 教材学习内容总结 第三章的内容相比之前两章更为具体&#xff0c;介绍的内容更为集中&#xff0c;主要说到了类和对象的问题&#xff0c;其中也仔细介绍了String类、Random类、Math类、NumberFormat类等类。此外也说到了与类…

Java中带有JWebSocket的WebServerSocket

首先&#xff0c;转到http://jwebsocket.org/下载2个软件包Server and Client。 如果要查看源代码&#xff0c;请下载源代码包。 服务器 解压缩服务器程序包。 转到“ conf”文件夹 选择“ jWebSocket.xml”文件打开 编辑“ jWebSocket.xml”文件&#xff0c;在标签<dom…

OpenCV入门指南----人脸检测

本篇介绍图像处理与模式识别中最热门的一个领域——人脸检测&#xff08;人脸识别&#xff09;。人脸检测可以说是学术界的宠儿&#xff0c;在不少EI&#xff0c;SCI高级别论文都能看到它的身影。甚至很多高校学生的毕业设计都会涉及到人脸检测。当然人脸检测的巨大实用价值也让…

matlab提取艾里斑,艾里斑:我不是雀斑

正是艾里斑&#xff0c;限制了光学仪器的精度我们知道凸透镜能把入射光会聚到它的焦点上&#xff0c;由于透镜的口径有一定大小&#xff0c;限制了光线的传播&#xff0c;所以凸透镜也会发生衍射。这导致透镜无法把光线会聚成无限小的点&#xff0c;而只会在焦点上形成具有一定…

mysql启动错误排查-无法申请足够内存

一般情况下mysql的启动错误还是很容易排查的&#xff0c;但是今天我们就来说一下不一般的情况。拿到一台服务器&#xff0c;安装完mysql后进行启动&#xff0c;启动错误如下&#xff1a; 有同学会说&#xff0c;哥们儿你是不是buffer pool设置太大了&#xff0c;设置了96G内存。…

Spring vs Guice:重要的一个关键区别

根据弹簧对象的名称识别它们 不管使用XML还是Java配置都没有关系&#xff0c;Spring范围大致类似于Map <String&#xff0c;Object>结构。 这意味着您不能有两个名称相同的对象 。 为什么这是一件坏事&#xff1f; 如果您的大型应用程序包含许多Configuration类或XML文件…

php 批量更新死锁,php – 在尝试获取锁定时,哪个查询导致死锁;尝试重新启动事务...

我无法弄清楚哪个Query在尝试获取锁定时导致死锁;尝试重新启动事务.我的mysql包装器有以下几行if (mysql_errno($this->conn) 1213) {$this->bug_log(0,"Deadlock. SQL:".$this->sql);}bug_log写入文件的位置.错误日志文件没有死锁错误,但/var/log/mysqld.…

Task和BackTask

一、总结性知识点&#xff1a; 1、Android应用运行时会创建任务Task&#xff0c;用于存放主窗口2、每一个任务包含一个堆栈数据结构&#xff0c;用于保存当前应用已创建的窗口对象&#xff0c;这个堆栈即回退栈BackStack3&#xff64; 位于回退栈顶的窗口会处于焦点状态4&#…