最近我在生产环境中遇到了一个bug,即当用户访问某个优惠券列表页面时,它出现了以下错误
java.lang.NoClassDefFoundError: com/myapp/common/util/WrappedBeanCopiermaven依赖关系是这样的
myapp
- coupon
- common 2.0
- common 1.0而common 2.0中只有WrappedBeanCopier,而我的and实际使用的是common 1.0,所以导致了这次事故的发生。
我想知道为什么它可以成功编译并部署到tomcat上?有没有办法让它尽快曝光?例如,编译失败。
发布于 2016-09-17 16:20:54
不幸的是,在编译过程中无法获得有关NoClassDefFoundError错误的通知。
这样做的原因是错误本身就是用来表示这个错误的:
(摘自Exception类的javadoc )
如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分,或作为使用新表达式创建新实例的一部分),但找不到类的定义,则抛出
。
编译当前正在执行的类时,搜索的类定义已存在,但再也找不到该定义。
因此,对于这种错误,真的没有什么灵丹妙药。你可以采取的措施来避免这种情况再次发生:
一个永远不会加载的类的示例:
private static Integer someThresholdValue = MyClass.calculateThreshold();
private static Integer calculateThreshold() {
throw new Exception("some error occured");
}注意:当上面的错误不经常发生时,它可能会变得非常糟糕,但只有在应用程序的引导序列的早期尝试加载类时,假设Spring上下文还没有准备好……所以每次你太渴望测试的时候都会得到一个NoClassDefFoundError,但是如果你在访问你的get应用程序之前等待10秒,那么一切都是好的……糟糕的回忆。
https://stackoverflow.com/questions/39544279
复制相似问题