【问题标题】:JSF 2.0 and Hibernate errorJSF 2.0 和休眠错误
【发布时间】:2011-03-30 19:55:23
【问题描述】:

我将我的应用程序部署到官方服务器并开始出现此错误:

堆栈跟踪: org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:401) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

根本原因

javax.servlet.ServletException: java.lang.NoClassDefFoundError: 可以 不初始化类 app.HibernateUtil org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862) org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791) org.apache.jsp.ajax.search_jsp._jspService(search_jsp.java:67) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

根本原因

java.lang.NoClassDefFoundError: 可以 不初始化类 app.HibernateUtil app.PersistanceHelper.(PersistanceHelper.java:23) app.SearchBean.(SearchBean.java:26) org.apache.jsp.ajax.search_jsp._jspService(search_jsp.java:54) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260) javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

在部署之前,该应用运行良好。我的 HibernateUtil 类是由 Netbeans 向导生成的。我看不出问题出在哪里。我花了一些时间在 google 中搜索类似的问题,但找到的答案(缺少 jars、拼写错误等)不适用于此解决方案,因为它适用于我的 PC,但不适用于官方服务器。对此有什么想法吗?如果需要,我可以添加其余的来源。 Apache Tomcat 日志不包含任何错误。谢谢你的帮助。

【问题讨论】:

    标签: java hibernate jsf tomcat6 jsf-2


    【解决方案1】:

    我认为您的类在类路径上,但 ClassLoader 在尝试 加载 类时遇到错误(如消息所示)。这通常发生在类具有使用 Class 的静态块或静态成员,而 ClassLoader 无法找到时。

    在这个生成的HibernateUtil.java 的特殊情况下,它应该是这样的:

    static {
      URL myurl = Thread.currentThread().getContextClassLoader().getResource("/some/path/to/hibernate.cfg.xml");
      sessionFactory = new Configuration().configure(myurl).buildSessionFactory();
    }
    

    所以:

    • 确保存在预期的休眠配置文件。
    • 确保 Hibernate jar 存在于目标计算机的类路径中。
    • 也许在你的静态块中添加一个try { ... } catch (Throwable t) { ... } 来记录错误。

    【讨论】:

      【解决方案2】:

      您应该阅读 Hibernate 发行版附带的用户文档。 Hibernate JAR 对其他 JAR 有很多运行时依赖项,例如一些 Apache Commons 的 JAR,例如“slf4j”JAR。如果在运行时缺少这些,即使所有 Hibernate JAR 都在正确的位置,Hibernate 也不会运行。

      【讨论】: