一般我們使用hibernate,最喜歡用的應該就是hql查詢吧,較為靈活寫法也跟sql相似,不過有的同志喜歡用criteria查詢的可能不會看到這個異常信息,呵呵。
今天把一hibernate war項目部署到wl10.3.3上,部署是不會報錯的,但是當你點到某個功能,這個功能下面有hql查詢,就會報錯,報錯信息如下:
java.lang.RuntimeException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]; nested exception is org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [select ...]
at …
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:227)
at weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:300)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:183)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.doIt(WebAppServletContext.java:3686)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3650)
at weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)
at weblogic.security.service.SecurityManager.runAs(SecurityManager.java:121)
at weblogic.servlet.internal.WebAppServletContext.securedExecute(WebAppServletContext.java:2268)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2174)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1446)
at weblogic.work.ExecuteThread.execute(ExecuteThread.java:201)
at weblogic.work.ExecuteThread.run(ExecuteThread.java:173)
>
通過自己做的JarFinder小工具,明顯可以在部署的war包中看到 org.hibernate.hql.ast.HqlToken 類,在hibernate-core-3.3.0.GA.jar中,這報錯不正常啊,估計就是某些包跟wl沖突了,后來google了一下,找到一個國外的帖子,說是antlr的問題,親身試驗了一次,果然是這個問題,現在就把解決方法跟大家分享下:
將你的war包打入ear包中,當然你還需要有META-INF文件,帶有weblogic-application.xml和application.xml,主要就是在weblogic-application.xml中解決,聲明prefer-application-packages,如下所示(關鍵line3-5):
<?xml version="1.0" encoding="UTF8"?>
<weblogic-application>
<prefer-application-packages>
<package-name>antlr.*</package-name>
</prefer-application-packages>
</weblogic-application>
而application.xml就較為簡單了,這里就不說了,相信打過ear包的都應該知道怎么回事,呵呵.打包后再次發布,問題解決。
附上解決問題原帖鏈接:http://forum.springsource.org/showthread.php?t=36860
不會寫application.xml的可以參考一下java的dtd:http://java.sun.com/dtd/
再附上一篇08年的英文文章,blogspot的,講的是weblogic jws+spring+hibernate開發的,需要翻墻才能看到:http://timezra.blogspot.com/2008/09/spring-hibernate-and-jax-ws-webservices.html
歡迎討論~
原文鏈接:http://www.shaojiahao.org/java/hibernate/weblogic-hibernate-hql-problem