项目从TOMCAT7移到WEBLOGIC12C后,出现异常org.hibernate.QueryException: ClassNotFoundException:

org.hibernate.hql.ast.HqlToken;

网上查了一下,是因为hibernate3.0是基于antlr的HQL/SQL查询翻译器,用到了antlr-x-x-x.jar,然而weblogic.jar中已经包含了antrl类库,而且weblogic.jar的加载顺序比项目下的jar加载顺序有限,导致以上无法加载的错误。总归就是说这个问题是因为类加载的先后顺序造成的,解决方法如下(都是基于改变加载顺序的):

   1、选择Hibernate3.0的查询翻译器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory;

      选择Hibernate2.1的查询翻译器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory;

      要使用3.0的批量更新和删除功能,只能选择1;当使用的时候出现中文“过滤条件”的情况,只能选择2。

      这种方式指标不治本,可能还有其他加载问题。

   2、将antlr-x-x-x.jar拷贝到java路径和java扩展路径下(JAVA_HOME%/jre/lib/ext/);

   3、改变jar加载优先级,优先使用项目的jar报,在部署项目的weblogic.xml里增加如下设置:

      <container-descriptor>
         <prefer-web-inf-classes>true</prefer-web-inf-classes>
      </container-descriptor>。

   4、修改% mydomain%\startWebLogic.cmd,修改set CLASSPATH ,使antlr-x-x-x.jar出现在前面;


附weblogic容器加载顺序:

   weblogic的web容器的classloader继承自ejb容器的classloader,ejb容器又继承自application classloade(负责加载classpath下面的类),所以缺省情况下classpath下面的类会被优先载入。weblogic中默认有以下几个级别:
   1、java路径和java扩展路径,这个算是级别最高的了;

   2、系统类路径;

    3、域下/lib,两个或多个域下的类是不可见的;
   4、WEB-INF/lib or WEB-INF/classes,这个是最低的级别。