替换jar的同名不同版本时出现奇怪的NoClassDefFoundError

来源:互联网 发布:龙的传人李青淘宝价格 编辑:程序博客网 时间:2024/05/20 20:19

今天遇到了一个奇怪的NoClassDefFoundError错误,在Eclipse下JRE环境与classLoader都没错的情况下,很纳闷怎么会出现一般由这2个问题导致的错误.下面贴出原代码:

public class MainTest {public static void main(String[] args) {Session session=null;Transaction tx=null;try {session=HibernateUtils.getSession();//begintx=session.beginTransaction();} catch (Exception e) {e.printStackTrace();tx.rollback();}finally{HibernateUtils.closeSession(session);}}}

错误信息是:

Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.yan.hibernate.HibernateUtils
at com.yan.test.MainTest.main(MainTest.java:55)

这样的日志信息是非常糟糕的,往往很难一目了然的定位到错误的根源,因为它屏蔽了这个类里面发生的错误.

调试方法

我把HibernateUtils单独放在一个JUnit的测试单元里,结果立刻看到问题的根源了.

java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory
at org.hibernate.cfg.Configuration.<clinit>(Configuration.java:151)
at com.yan.hibernate.HibernateUtils.<clinit>(HibernateUtils.java:13)
at com.yan.test.MainTest.main(MainTest.java:20)
Caused by: java.lang.ClassNotFoundException: org.slf4j.LoggerFactory

很明显,Jar包中依赖的类没有找到,但是由于我在原程序中没有catch Error类型,导致错误无法跟踪或断链.说到这个,我想起之前公司项目中有这样的一段代码,也是因为异常捕获到之后没有正确的处理而导致跟踪不到root cause.引以为鉴.

附带几篇异常处理的文章:


http://www.ibm.com/developerworks/cn/java/j-lo-exception/index.html

http://www.ibm.com/developerworks/cn/java/j-lo-exceptionframework/

原创粉丝点击