`

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还支持国际化...

    NoSuchMethodException解决办法.md

    若方法不存在或签名不正确,则会抛出NoSuchMethodException异常,随后可通过捕获异常进行适当处理,例如打印错误信息或记录日志。 需要注意的是,当使用`getMethod()`时,你必须提供精确匹配方法签名的参数类型数组...

    NoSuchMethodException如何解决.md

    如果存在不一致,比如大小写错误、参数类型不匹配或者参数个数不对等问题,都可能导致NoSuchMethodException异常的发生。 2. 使用正确的类加载器。Java中的类加载器负责加载类,如果使用了一个无法正确加载目标类的...

    java.lang.NoSuchMethodException: .getPortClassMap()

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

    commons-beanutils-1.9.3.jar

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

    java.lang.NoSuchMethodException(解决方案).md

    Java是一种区分大小写的语言,因此,即使方法名的拼写只有一个字符的差异,也会导致异常。对于包含有多个单词的方法名,建议采用驼峰命名法或者使用下划线分隔单词,以减少拼写错误的可能。 其次,方法签名的重要性...

    NoSuchMethodException(解决方案).md

    NoSuchMethodException是Java程序中经常遇到的一种运行时异常,它表明程序在运行时试图调用一个不存在的方法。这种情况通常发生在使用反射API动态调用方法时,比如Java的java.lang.reflect包下的相关类。解决...

    Java常见异常大全.pdf

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

Global site tag (gtag.js) - Google Analytics