[JAVA] 异常 java.lang.NoClassDefFoundError: org/joda/time/YearMonth 的处理

项目场景:

  • 开发环境:IDEA + Tomcat 7
  • 数据库:MySql
  • 前端主要使用公司自己设计的一套样式,后端基于SpringMVC、Spring、MyBatis进行开发,使用Maven构建。Spring 版本 5.3.8 RELEASE。

问题描述:

从SVN将项目down下来之后发现运行的时候会抛出 500 异常,查看异常信息发现如下说明:

org.springframework.beans.factory.BeanCreationException:
	 (中间省去一大段) nested exception is java.lang.NoClassDefFoundError: 
	 org/joda/time/YearMonth

解决方案:

解决方案很简单,直接通过 maven 引用新的 joda-time 包就好,只要是2.0版本以上的都行,添加依赖后问题解决:

<!-- https://mvnrepository.com/artifact/joda-time/joda-time -->
<dependency>
    <groupId>joda-time</groupId>
    <artifactId>joda-time</artifactId>
    <version>2.10</version>
</dependency>

原因分析:

光找到解决方案显然不够,尽管我个人水平不足不是很能理解得了深层的原理,但原因还是要知道的。根据包名和类名进行定位,发现引入后有两个 joda-time.jar 包存在:
在这里插入图片描述
说明在引入前我们已经有了一个版号为1.6.2的包存在了,这也是为什么错误类型是 “NoClassDefFoundError” 而非 “ClassNotFoundException” 的原因。继续往下查,我在 Spring Framework 的 Github 主页下找到了这样一段对话:
在这里插入图片描述
图可能比较模糊,原链接在下方,有兴趣可以自己去看看。简而言之,从 Spring Framework 4.0 以上的版本开始,他们就不再支持 Joda-time 2.1 以下的版本了,尽管由于自动注册(?)的原因,他们不得不继续支持使用,但从 5.0 版本开始我们就必须得使用 Joda-time 2.1 及以上版本的 jar 包。我的 Spring 版本是 5.3.8,因此替换依赖后,问题就迎刃而解了。

图中评论链接:NoClassDefFoundError: org/joda/time/YearMonth for joda-time < 2 [SPR-13730]


后续

我原本以为这个问题到这里就结束了,因为我发现我的项目已经可以正常的运转起来了,但当我重新检查 Tomcat 的日志的时候,我发现 NoClassDefFoundError 这个异常仍旧存在,并且指向的还是 joda-time 这个包,推测是因为在引用列表中仍旧保留着 1.6.2 版本的 jar 包,所以程序仍旧在调用它。因此接下来就需要移除这个 jar 包。
首先声明这个玩意儿不是我手动引入进来的,故我的 pom 文件里没有这个东西,我也不想一个个找过去 excusion,所以我用了个比较直接的方法。

  • 首先找到你 maven 的本地库所在位置,这个可以在 Setting -> Build, Execution, Deployment -> Maven 中找到,默认不变的话都是在 C 盘底下。
    在这里插入图片描述
  • 随后在 repository 文件夹中找到 joda-time 这个文件夹,相关jar包全在里面
  • 修改 joda-time 的文件名为其他任意一个名字,我在这里改成了 joda-time1,这是为了让系统找不到这个文件夹,随后进入下一步操作。
  • 在 maven 菜单上选择 clean 操作,运行完毕后打开项目设置 Project Structure,你会发现 Problem 处有新的问题出现了,点击进去可以看到 joda-time 的相关 jar 包引用失效,系统建议移除相关引用路径。这里我们选择移除 1.6 版本的 jar 包,保留 2.1 版本的jar包
    在这里插入图片描述
  • 回到 repository 文件夹,将 joda-time 文件夹的名字改回去。
  • 回到 IDEA,重新运行 maven 指令 clean - complie - package,再次运行项目,相关错误就不再出现了。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值