资讯专栏INFORMATION COLUMN

java.lang.NoSuchMethodError异常

weknow619 / 2956人阅读

摘要:今天在对项目进行国际化改造时遇到了这个异常。最后查出是由于包冲突导致这个异常的发生。我创建了两个简单的工程对这个异常情景进行模拟。现在部署这个工程,会得到这个异常。虽然异常名字不同,但反映的还是这个类没有这个属性。

今天在对项目进行国际化改造时遇到了java.lang.NoSuchMethodError这个异常。最后查出是由于jar包冲突导致这个异常的发生。下面描述这个异常发生的情景。
我创建了两个简单的maven工程对这个异常情景进行模拟。其中一个工程是test_dependency,它的maven配置如下,这个工程有一个spring-2.5.6依赖。

另一个工程是test,它的主要maven配置如下。

test是一个war类型的工程,它依赖于spring-X-3.2.1.RELEASE的一些jar包,并且依赖前面的test_dependency,这样就导致了test工程间接依赖了spring-2.5.6这个jar。现在test工程中同时存在了两个spring版本,并且注意spring-x-3.2.1.RELEASE是在spring-2.5.6之前被依赖的。
在spring的配置文件中,有下面的用于国际化的bean配置。

其中basename是资源文件的名字,defaultEncoding是编码格式,如果没有defaultEncoding,那么中文会乱码。
现在部署这个工程,会得到BeanCreationException这个异常。异常主要内容如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name "messageSource" defined in class path resource [context.xml]: Error setting property values; nested exception is 
Caused by: org.springframework.beans.NotWritablePropertyException: Invalid property "defaultEncoding" of bean class [org.springframework.context.support.ResourceBundleMessageSource]: Bean property "defaultEncoding" is not writable or has an

这个异常大致内容就是说ResourceBundleMessageSource这个类没有defaultEncoding这个属性。
ctrl加鼠标左键查看ResourceBundleMessageSource这个类的源码,确实有defaultEncoding这个属性啊!
spring配置文件不行,尝试直接通过方法调用设置编码。在spring配置文件中去掉defaultEncoding的配置。在servlet中加入如下代码:

ResourceBundleMessageSource messageSource = springContext.getBean(ResourceBundleMessageSource.class);
messageSource.setDefaultEncoding("utf-8");

这次启动web成功了,但是访问接口时又报了下面的异常。

虽然异常名字不同,但反映的还是ResourceBundleMessageSource这个类没有defaultEncoding这个属性。
查看源码明明是有defaultEncoding这个属性的,可是却报没有这个属性的异常。于是执行mvn dependency:tree命令查看所有依赖的jar包,终于发现了除了spring3.x的依赖外,还有一个spring-2.5.6的依赖。查看spring-2.5.6的源码,发现它也有一个ResourceBundleMessageSource类,并且这个类中没有defaultEncoding这个属性。看来当部署war包时,使用的类是来自于spring-2.5.6这个jar,而不是来自于spring3.x。修改maven的配置如下,排除对spring-2.5.6的依赖,问题就解决了。

发生这个异常要满足下面的条件:
1.首先工程类型必须是war,如果是jar的话不会发生这个异常。
2.其次是spring-3.x的依赖必须在spring-2.5.6的前面配置,否则编译时就会报错找不到这个属性,也就不会发生这个异常了。
可是为什么在编译的时候使用spring-3.x依赖,运行时却使用spring-2.5.6这个依赖呢?感觉这真是maven的一个大坑啊。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/70233.html

相关文章

  • java.lang.NoSuchMethodError: antlr.collections.AST

    摘要:具体操作如下在下,在文本框中搜索选择第二种可能性解决主要是里面的和中的与冲突删除即可,具体方法在下,在文本框中搜索选择在该应用的目录删除目前貌似就这么两种解决方法吧亲测第一种可用 showImg(https://segmentfault.com/img/bVOIUy?w=590&h=49); showImg(https://segmentfault.com/img/bVOIXc?w=5...

    Zachary 评论0 收藏0
  • 异常!!!

    摘要:常见的异常列出四五种,是基本要求。该异常经常被称为强制类型转换异常。违法的状态异常。数组大小为负值异常。属性不存在异常。是所有虚拟机正常操作期间可以被抛出的异常的父类。由安全管理器抛出,用于指示违反安全情况的异常。字符串索引越界异常。 常见的异常列出四五种,是基本要求。更多的。。。。需要注意积累了 常见的几种如下: NullPointerException - 空指针引用异常Class...

    booster 评论0 收藏0
  • JVM类加载思维导图

    摘要:用一张思维导图尽可能囊括一下的类加载过程的全流程。本文参考自来自周志明深入理解虚拟机第版,拓展内容建议读者可以阅读下这本书。 用一张思维导图尽可能囊括一下JVM的类加载过程的全流程。 本文参考自来自周志明《深入理解Java虚拟机(第2版)》,拓展内容建议读者可以阅读下这本书。 showImg(http://ocxhn1mzz.bkt.clouddn.com/class%20loadin...

    Crazy_Coder 评论0 收藏0
  • Java™ 教程(常见问题及其解决方案)

    常见问题(及其解决方案) 编译器的问题 Microsoft Windows系统上常见的错误消息。 javac is not recognized as an internal or external command, operable program or batch file 如果你收到这个错误,Windows将无法找到编译器(javac)。 这里有一种方法可以告诉Windows哪里可以找到ja...

    netmou 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<