NoClassDefFoundError使用Hibernate

时间:2014-08-04 17:48:56

标签: java spring hibernate spring-mvc blackboard

我在Blackboard上的Building Block中使用Spring 3.1.1.RELEASE和Hibernate 4.1.10.FINAL了解并获得以下异常:

java.lang.NoClassDefFoundError:无法初始化类org.hibernate.cfg.PropertyContainer

这似乎是一个类路径问题,所以我做了一些挖掘并添加了this post中建议的库,但是发生了同样的错误。

所以我的classpath现在包含必要的依赖项,但我仍然得到异常。我可以通过哪些额外的观点来确定和解决这个问题?

编辑:我已经验证了jboss-logging JAR在我的类路径中。

编辑:请求的堆栈跟踪:https://gist.github.com/whargrove/79cbc9c5bd65217e3da3

重新启动Tomcat并重新部署WAR后,Tomcat日志中会出现以下异常:

  1. java.security.AccessControlException:拒绝访问(“java.util.PropertyPermission”“jboss.i18n.generate-proxies”“write”)
  2. org.springframework.beans.factory.BeanCreationException:创建在ServletContext资源[/WEB-INF/config/spring.xml]中定义名称为'mySessionFactory'的bean时出错:init方法的调用失败;嵌套异常是java.lang.NoClassDefFoundError:无法初始化类org.hibernate.cfg.PropertyContainer
  3. (上面的gist链接中提供了完整的堆栈跟踪。)

1 个答案:

答案 0 :(得分:0)

消息

  

java.lang.NoClassDefFoundError:无法初始化类 SomeClass

表示JVM已尝试并且无法在类 SomeClass 上执行静态初始化。当JVM第一次尝试加载类时,可能会发生另一个错误。

看一下source of the PropertyContainer class,唯一的静态初始化是一个设置系统属性的静态初始化器,以及一个初始化该类记录器的行。设置系统属性不应该导致问题,所以我的猜测是你的类路径中缺少使用的记录器类。

使用的记录器类是org.jboss.logging.Logger。这个类的一个快速谷歌建议一个名为jboss-logging.jar的jar。尝试获取该副本并将其添加到类路径中。

(顺便说一句,如果你无法在'无法初始化类错误之前找到先前的错误,那可能是因为缺少的JAR会影响日志记录。日志记录是应用程序倾向于假设的总是工作,可以在任何地方使用。你看到的异常可能是从finally块中抛出的,当相应的try块也尝试进行一些记录但是扔了从finally块中抛出的异常替换先前抛出的任何异常。)

编辑以响应堆栈跟踪:我现在可以看到设置系统属性不是问题我错了!我不知道关于Blackboard Learn的第一件事,但它或其他东西可能会加强你的应用程序的安全性,从而导致上述问题。

但它确实证实了我认为问题的真正原因是在Could not initialize class消息之前。