`

jar包冲突导致的NoSuchMethodException或NoSuchFieldError异常

    博客分类:
  • J2EE
 
阅读更多

 

 

问题发生背景:在tomcat中部署web项目的时候,访问jsp文件时抛出java.lang.NoSuchMethodException异常
解决办法:最终发现tomcat自带的jsp相关jar包和项目中的jar包有冲突,移除项目中的冲突jar包后,项目发布正常,jsp可以正常访问;
 
问题定位总结

 

当一个项目使用的jar包越来越多,代码经常在运行的时候抛出异常:java.lang.NoSuchMethodException,java.lang.NoSuchFieldError,基本是存在多个jar包包含相同的class类文件导致的,运行期可能用的class没有该方法等。

 

 

从JVM类加载机制进行剖析:

 

a. Bootstrap ClassLoader/启动类加载器
主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作.
b. Extension ClassLoader/扩展类加载器
主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作
c. System ClassLoader(APPClassLoader)/系统类加载器
主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.
d. User Custom ClassLoader/用户自定义类加载器(java.lang.ClassLoader的子类)
在程序运行期间, 通过java.lang.ClassLoader的子类动态加载class文件, 体现java动态实时类装入特性.

JVM虚拟机采用双亲委托类加载机制,通过类加载器进行加载,Tomcat使用WebappClassLoader类加载器:
所以在Tomcat 6中默认情况下,Jar包的加载顺序是:
1)JDK_HOME/lib和JDK_HOME/lib/ext下的jar
2)Web应用WEB-INF\lib下的包
3)Tomcat\lib下的包
如果在WEB-INF\lib和Tomcat\lib下有包名类名完全相同的Class类被加载(由于版本不同等因素),那么在程序执行时,将无法判断具体使用哪一个Class,
从而会抛出java.lang.NoSuchMethodException或java.lang.NoSuchFieldError异常

 

 

 

 

 

 

  • 大小: 34.4 KB
分享到:
评论

相关推荐

    用反射解析jar文件并执行里面Java代码

    此外,反射操作可能会抛出多种异常,如`ClassNotFoundException`, `NoSuchMethodException`, `IllegalAccessException`, `InstantiationException`等,因此在实际应用中必须妥善处理这些异常。 总结起来,通过Java...

    Java 自动加载JAR文件并运行其中的类方法

    5. **异常处理**:在上述过程中,可能会遇到`ClassNotFoundException`、`InstantiationException`、`IllegalAccessException`或`NoSuchMethodException`等异常,因此应进行适当的异常处理。 6. **释放资源**:使用...

    java 请求的方法不存在(NoSuchMethodException)

    3. **动态代理**:在使用Java动态代理生成的代理类中,如果尝试调用的目标接口方法不存在,同样会导致异常。 二、常见场景 1. **类加载顺序**:在多模块项目中,类加载顺序可能影响到方法的查找,如果依赖的类或...

    ClassConflictCheck:检测类路径下是否存在jar包中的class冲突,通常用于web应用的lib目录下class冲突检查

    当一个项目使用的jar包较多时,代码经常在运行的时候抛出异常:java.lang.NoSuchMethodException,java.lang.ClassNotFoundException,基本是存在多个jar包包含相同的class类文件导致的,运行期引用的class由于版本...

    beanutils jar包

    4. **处理异常**:BeanUtils在遇到无法执行的操作(如属性不存在或类型不匹配)时,会抛出`InvocationTargetException`和`NoSuchMethodException`,帮助开发者定位问题。 5. **国际化支持**:BeanUtils还支持国际化...

    java.lang.NoSuchMethodException: .getPortClassMap()

    在给出的标题 "java.lang.NoSuchMethodException: .getPortClassMap()" 中,异常指向了 `getPortClassMap()` 这个方法,暗示在程序运行时,尝试访问或调用的这个方法在相应的类中没有被找到。 `getPortClassMap` ...

    commons-beanutils-1.9.3.jar

    BeanUtils库对可能出现的异常进行了包装,比如`NoSuchMethodException`和`IllegalAccessException`,通过`BeanUtils`类的方法抛出的是`BeanUtilsException`,这简化了异常处理逻辑。 6. **国际化支持** BeanUtils...

    Java常见异常大全.pdf

    非检查型异常则包括Error和RuntimeException及其子类,这类异常编译器不会强制要求处理,因为它们通常是由程序逻辑错误导致,比如空指针异常NullPointerException。 接下来,我们来细看文档中列出的各个具体异常: ...

    java 反射 报错 no such method exception

    4. **依赖库问题**:缺少必要的JAR文件或存在冲突的JAR版本也可能导致方法查找失败。 5. **框架规范遵循**:对于Struts2等框架,应遵循其规范,如避免在Action方法中使用参数(除非使用特殊注解),因为框架通常...

    java异常汇总.txt

    这可能由类路径问题、类加载器冲突或依赖项缺失引起。 #### 24. NoClassDefFoundError - 类定义未找到错误 当类加载器找不到某个类的定义时,会抛出`NoClassDefFoundError`。这可能由类路径配置错误或依赖库缺失...

    Java中常见的异常分析

    12. **方法未找到异常:NoSuchMethodException** - 在运行时,如果试图调用一个不存在的方法,会抛出此异常。 13. **抽象方法错误:AbstractMethodError** - 当应用试图调用一个抽象方法时,会抛出此异常,这通常...

    java异常分析及解决办法

    预防措施是检查数学表达式,确保不会执行可能导致异常的操作。 4. **java.lang.ArrayIndexOutOfBoundsException**: 当尝试访问数组的一个不存在的索引时,会抛出此异常。避免此异常的方法是确保数组索引始终在0到...

    JAVA常见异常解析,面试用

    确保类名、包名以及类路径设置正确,特别是从JAR文件或网络加载类时。 3. **java.lang.ArithmeticException**: 表示执行了非法的数学运算,如除以零。在进行数学计算时,需要特别注意除数不能为零,并检查其他...

    JAVA异常大全

    12. **方法未找到异常:NoSuchMethodException** - 当尝试调用一个不存在的方法时,会抛出此异常。 除了这些常见异常,Java还提供了一些其他类型的异常,如: 13. **AbstractMethodError** - 当应用程序试图调用一...

    JAVA常见异常整理.docx

    - `IOException`:与输入/输出操作相关的异常,如读写文件或网络通信问题。 - `NoSuchMethodException`:尝试调用不存在的方法时抛出。 - `AbstractMethodError`:当应用尝试调用一个抽象方法,但该方法未在子类...

    Metaq在JDk 7下的异常及解决方案

    异常现象主要表现为:在尝试清理内存映射文件时,由于Java反射机制调用了`java.nio.DirectByteBuffer`类中的`viewedBuffer()`方法,导致`NoSuchMethodException`异常。异常堆栈跟踪显示,问题出在`MapedFile`类的...

    常见异常处理方案

    异常是程序运行时遇到的错误,如果不妥善处理,可能会导致程序崩溃。以下是一些常见的Java异常及其处理方案: 1. **`java.lang.NullPointerException`**: 当尝试访问或操作一个null引用的对象时,会抛出此异常。...

    java 异常种类总结【转】.docx

    这些异常可能会在编程过程中出现,并且可能会导致程序的崩溃或中断。了解这些异常种类可以帮助开发者更好地处理和解决问题。 1. 算术异常类:ArithmeticExecption ArithmeticExecption 是一种算术运算异常,例如...

    java 异常总结

    在Java编程中,异常处理是软件开发过程中不可或缺的一部分。良好的异常处理能够帮助我们及时发现并解决问题,从而提高程序的稳定性和健壮性。本文旨在全面总结Java中常见的异常类型及其解决策略,帮助开发者更好地...

Global site tag (gtag.js) - Google Analytics