公司需要从Tomcat服务器迁移至webLogic服务器上,但是部署时抛出异常“org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken”错误信息,经过在网络上搜索汇总终于弄明白问题的原因以及解决方法,下面本站素文宅 www.yoodb.com 为大家分享一下如何解决此异常的几种方法,仅供大家参考学习。
详细异常“org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken”错误信息,具体如下:
org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [from Yoodb] at org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:80) at antlr.CharScanner.setTokenObjectClass(CharScanner.java:340) at org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:54) at antlr.CharScanner.<init>(CharScanner.java:51) at antlr.CharScanner.<init>(CharScanner.java:60) at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:56) at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:53) at org.hibernate.hql.antlr.HqlBaseLexer.<init>(HqlBaseLexer.java:50)
造成此异常的问题原因,具体情况如下;
Hibernate3.0 采用新的基于ANTLR的HQL/SQL查询翻译器,在Hibernate的配置文件中,hibernate.query.factory_class属性用来选择查询翻译器。
hibernate3中需要用到antlr.jar包,但是weblogic.jar中已经包含了antrl类库此时会产生一些类加载的错误,导致无法找到war或者ear中的hibernate3.jar包,出现错误之后antlr会调用System.exit()函数,这样weblogic就会中止服务。
下面说一说具体的几种解决方案,欢迎大家参考发表意见
方案一:变更Hibernate 配置 hibernate.query.factory_class 设置其他查询翻译器,此方式是比较简单的但是有利有弊。
1)选择Hibernate3.0的查询翻译器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
2)选择Hibernate2.1的查询翻译器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory
为了使用3.0的批量更新和删除功能,只能选择版本Hibernate3否则不能解释批量更新的语句,当使用的时候出现了不支持条件输入中文的情况。选择版本Hibernate2可以支持输入中文,但没法解释批量更新语句。
方案二:删除Weblogic目录引入antlr-2.7.5H3.jar包
用WinRar或Winzip打开\weblogic81\server\lib目录下weblogic.jar 删除里面的antlr目录, 然后再antlr-2.7.5H3.jar放在weblogic.jar的同一目录,重新打包即可(简单测试没什么问题,但不建议采用)
方案三:Windows系统下,修改Weblogic目录下启动项配置
将Hibernate3里自带的包antlr-2.7.5H3.jar包放到%WL_HOME%\server\lib(在环境变量中配置WL_HOME参数,此处省略)目录下,修改%mydomain%\startWebLogic.cmd,具体如下:
在set CLASSPATH之前加上下面一句: set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.5H3.jar;
在set CLASSPATH之后加上下面一句: set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%
方案四:修改weblogic类加载顺序,修改weblogic中PRE_CLASSPATH配置
在项目的WEB-INF目录下新建weblogic.xml文件将<prefer-web-inf-classes>的值设为true时,如果使用CXF发布WebService接口会出现javax/xml/namespace/QName无法识别的异常,具体配置参考内容如下:
<weblogic-web-app xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd"> <container-descriptor> <prefer-web-inf-classes>true</prefer-web-inf-classes> <!--解决CXF发布webService问题 Begin--> <prefer-application-resources> <resource-name>META-INF/services/javax.xml.ws.spi.Provider</resource-name> </prefer-application-resources> <prefer-application-packages> <package-name>antlr.*</package-name> </prefer-application-packages> <!--解决CXF发布webService问题 end--> </container-descriptor> </weblogic-web-app