原创

org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken

        公司需要从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

关注下方微信公众号“Java精选”(w_z90110),回复关键字领取资料:如HadoopDubboCAS源码等等,免费领取资料视频和项目。 

涵盖:程序人生、搞笑视频、算法与数据结构、黑客技术与网络安全、前端开发、Java、Python、Redis缓存、Spring源码、各大主流框架、Web开发、大数据技术、Storm、Hadoop、MapReduce、Spark、elasticsearch、单点登录统一认证、分布式框架、集群、安卓开发、iOS开发、C/C++、.NET、Linux、Mysql、Oracle、NoSQL非关系型数据库、运维等。

评论

分享:

支付宝

微信