其实这个问题在以前就遇到过,当时解决了,但今天在部署一个测试轻应用的时候一直没有想起来,特此记录一下。
这个问题出现在使用WebLogic(我使用的是10.3.5版本)发布SSH架构的应用。在操作数据库的时候使用Hibernate配合JPA实现。发布之后无法从数据库获取数据,从日志看到故障提示org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.internal.ast.HqlTok
这个错误的根本原因是weblogic要查找自己的antlr,和lib下面的antlr包冲突。最简单的办法是修改Hibernate的配置文件
添加<property name="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</property>
如果项目是用spring来管理Hibernate,则需要使用另外一种方法
修改weblogic.xml
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>
说明:prefer-web-inf-classes=true是WebLogic's classloader在有重名类时,优先加载Web应用中WEB-INF内的类