今天客户要求将原有运行在tomcat环境下的WEB程序切换到WebLogic10.3.6.0上,在切换至WebLogic环境下启动的过程中程序报错,抛出的异常信息如下:

ClassNotFoundException: org.hibernate.hql.ast.HqlToken


  • 此问题出现的原因如下:

Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器,在Hibernate的配置文件中,hibernate.query.factory_class属性用来选择查询翻译器。

   A、选择Hibernate3.0的查询翻译器:

   hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory

   B、选择Hibernate2.1的查询翻译器

   hibernate.query.factory_class=org.hibernate.hql.classic.ClassicQueryTranslatorFactory

   为了使用3.0的批量更新和删除功能,只能选择A,否则不能解释批量更新的语句,当使用的时候出现了不支持条件输入中文的情况。选择B可以支持输入中文,但没法解释批量更新语句了。在hibernate3中需要用到antlr,然而这个包在weblogic.jar中已经包含了antrl类库,就会产生一些类加载的错误,无法找到在war或者ear中的hibernate3.jar。 出现这个错误之后,antlr会调用System.exit(),这样weblogic就会中止服务。


  • 解决方法如下:

   将发生冲突的JAR文件单独放到一个目录中【/web/test/user_lib/antlr.jar】,然后修改${mydomain}/bin/startWebLogic.sh文件,将CLASSPATH="${SAVE_CLASSPATH}"修改为CLASSPATH="/web/test/user_lib/antlr.jar:${SAVE_CLASSPATH}"后,重启管理服务即可解决此问题。