0

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

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

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

所以我的类路径现在包含必要的依赖项,但我仍然遇到异常。我可以查看哪些其他要点来识别和解决此问题?

编辑:我已经验证了 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

(上面的要点链接中提供了完整的堆栈跟踪。)

4

1 回答 1

0

讯息

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

意味着 JVM 已经尝试对SomeClass类执行静态初始化但失败了。当 JVM 第一次尝试加载类时,很可能还有另一个错误。

看一下PropertyContainer 类的源代码,唯一的静态初始化是设置系统属性的静态初始化器,以及为该类初始化记录器的行。设置系统属性不会导致问题,所以我的猜测是您的类路径中缺少使用的记录器类。

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

(顺便说一句,如果在“无法初始化类”错误之前找不到先前的错误,那很可能是因为缺少 JAR 会影响日志记录。应用程序倾向于假设日志记录始终有效并且可以在任何地方使用。finally当相应的try块也尝试进行一些记录但抛出异常时,您看到的异常可能是从试图进行一些日志记录的块内抛出的。从finally块内抛出的异常会替换以前抛出的任何异常。)

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

然而,它确实证实了我的信念,即问题的真正原因是在Could not initialize class消息之前。

于 2014-08-04T18:40:36.540 回答