首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让NoClassDefFoundError在编译阶段暴露

如何让NoClassDefFoundError在编译阶段暴露
EN

Stack Overflow用户
提问于 2016-09-17 15:45:43
回答 1查看 49关注 0票数 0

最近我在生产环境中遇到了一个bug,即当用户访问某个优惠券列表页面时,它出现了以下错误

代码语言:javascript
复制
java.lang.NoClassDefFoundError: com/myapp/common/util/WrappedBeanCopier

maven依赖关系是这样的

代码语言:javascript
复制
myapp
    - coupon
        - common 2.0
    - common 1.0

common 2.0中只有WrappedBeanCopier,而我的and实际使用的是common 1.0,所以导致了这次事故的发生。

我想知道为什么它可以成功编译并部署到tomcat上?有没有办法让它尽快曝光?例如,编译失败。

EN

回答 1

Stack Overflow用户

发布于 2016-09-17 16:20:54

不幸的是,在编译过程中无法获得有关NoClassDefFoundError错误的通知。

这样做的原因是错误本身就是用来表示这个错误的:

(摘自Exception类的javadoc )

如果Java虚拟机或ClassLoader实例尝试加载类的定义(作为常规方法调用的一部分,或作为使用新表达式创建新实例的一部分),但找不到类的定义,则抛出

编译当前正在执行的类时,搜索的类定义已存在,但再也找不到该定义。

因此,对于这种错误,真的没有什么灵丹妙药。你可以采取的措施来避免这种情况再次发生:

  • 使用production)
  • even
  • 进行更彻底的测试(在编译和Maven更多测试之间应该有一个测试阶段、环境等),因为这个错误不仅会在类定义发生更改时发生,而且如果您的类在初始化静态变量时由于异常而无法加载,那么使用NoClassDefFoundErrors也会遇到困难。

一个永远不会加载的类的示例:

代码语言:javascript
复制
private static Integer someThresholdValue = MyClass.calculateThreshold();

private static Integer calculateThreshold() {
   throw new Exception("some error occured");
}

注意:当上面的错误不经常发生时,它可能会变得非常糟糕,但只有在应用程序的引导序列的早期尝试加载类时,假设Spring上下文还没有准备好……所以每次你太渴望测试的时候都会得到一个NoClassDefFoundError,但是如果你在访问你的get应用程序之前等待10秒,那么一切都是好的……糟糕的回忆。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39544279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档