项目从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,这个是最低的级别。