项目之前在 Tomcat 环境下一直都正常运行,今天应客户要求需要迁移到 webLogic 10.3.6 下, 部署后竟然抛出了 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken 异常,经过一番搜索后弄明白了问题的产生原因及解决方法。

问题原因

Hibernate3 采用新的基于 antlr 的 HQL/SQL 查询翻译器,在 hibernate3 中需要用到 antlr,然而这个包在 weblogic 中已经包含了 antrl 类库,所以会产生一些类加载的错误,无法找到在 war 或 ear 中的 hibernate3.jar。

解决方案

方案一:修改 Hibernate 配置 hibernate.query.factory_class 设置其他查询翻译器

(1)使用 Hibernate3 的查询翻译器: 
    hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory
(2)使用 Hibernate2 的查询翻译器: 
    hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory
    说明:为了使用 Hibernate3 的批量更新和删除功能,只能选择(1),否则不能解释批量更新的语句,但使用(1)时查询条件不支持中文。如果使用(2),可以支持中文,但没法解释批量更新语句了

方案二:修改 weblogic 的类加载顺序

    在项目的 WEB-INF 目录下新建 weblogic.xml,然后将 <prefer-web-inf-classes> 的值设为 true。
  1. <weblogic-web-app
  2. xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app
  5. http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">
  6. <container-descriptor>
  7. <!--优先加载位于 Web 应用程序的 WEB-INF 目录中的类,然后再加载应用程序或系统类加载器中的类-->
  8. <prefer-web-inf-classes>false</prefer-web-inf-classes>
  9. </container-descriptor>
  10. </weblogic-web-app>

说明:如果刚好你的应用使用了 CXF 发布 webService,那么使用该方案后会出现 javax/xml/namespace/QName 无法识别的异常,大概错误信息如下:

  1. Invocation of init method failed; nested exception is java.lang.LinkageError:
  2. loader constraint violation: when resolving field "DATETIME" the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
  3. of the referring class, javax/xml/datatype/DatatypeConstants, and the class loader (instance of <bootloader>) for the field's resolved type,
  4. javax/xml/namespace/QName, have different Class objects for that type

该问题如何解决将在后面的方案三和方案四时提到。

方案三:设置 weblogic 的 PRE_CLASSPATH

    修改 %DOMAIN_HOME%/bin/setDomainEnv.cmd(Linux 为 setDomainEnv.sh),如:D:\Program\weblogic-10.3.6\mydomain\bin\setDomainEnv.cmd,在 set JAVA_HOME 的后面加上set PRE_CLASSPATH=path_of_antlr_jar,如:
  1. set PRE_CLASSPATH=F:\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar

方案四:设置 prefer-application-resources 和 prefer-application-packages

    修改 WEB-INF/weblogic.xml,不多作说明,直接上代码(此处的 prefer-application-resources 是为了解决方案二中提到的 CXF 发布 webService 的问题):
  1. <weblogic-web-app
  2. xmlns="http://xmlns.oracle.com/weblogic/weblogic-web-app"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://xmlns.oracle.com/weblogic/weblogic-web-app
  5. http://xmlns.oracle.com/weblogic/weblogic-web-app/1.3/weblogic-web-app.xsd">
  6. <container-descriptor>
  7. <prefer-web-inf-classes>false</prefer-web-inf-classes>
  8. <prefer-application-resources>
  9. <resource-name>META-INF/services/javax.xml.ws.spi.Provider</resource-name>
  10. </prefer-application-resources>
  11. <prefer-application-packages>
  12. <package-name>antlr.*</package-name>
  13. </prefer-application-packages>
  14. </container-descriptor>
  15. </weblogic-web-app>

附:weblogic.xml 部署描述符参考文档

http://docs.oracle.com/cd/E24329_01/web.1211/e21049/weblogic_xml.htm
http://edocs.weblogicfans.net/wls/docs92/webapp/weblogic_xml.html

参考资料:
http://guojuanjun.blog.51cto.com/277646/288121
http://tobato.iteye.com/blog/1845969
http://stackoverflow.com/questions/2702266/classnotfoundexception-hqltoken-when-running-in-weblogic

weblogic 下异常 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken的更多相关文章

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

    环境:weblogic10.3.5,hibernate3,GGTS(groovy/grails tools suite):出现这问题是因为该项目是从weblogic8.1.6下移植到weblogic1 ...

  2. weblogic中部署项目报错org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken .

    原因: 原因是weblogic要查找自己的antlr,和lib下面的antlr包冲突.... 解决方法: 在weblogic.xml添加 <container-descriptor>    ...

  3. weblogic10异常:org.hibernate.hql.ast.HqlToken

    转自:http://www.programgo.com/article/68682994452/ 在做查询的时候,报出  org.hibernate.QueryException: ClassNotF ...

  4. WebLogic发布S2SH应用时提示ClassNotFoundException: org.hibernate.hql.ast.HqlToken异常

    使用Spring+hibernate如下 <properties> <!--定义方言.fetch深度.是否显示sql--> <property name="hi ...

  5. 解决Eclipse编译器报错ClassNotFoundException:Org.hibernate.hql.ast.HqlToken

    最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误 ...

  6. 解决org.hibernate.QueryException illegal attempt to dereference collection 异常错误

    今天做项目的时候,有两个实体:款式.品牌两者关系是多对多的关联关系,实现的功能是:通过选择款式,显示出该款式的所有品牌.HQL语句如下: 运行时出现这个异常错误:org.hibernate.Query ...

  7. java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition的解决方案

    今天在GitHub上面看到一个有意思的项目,下载下来,使用tomcat部署失败,出现异常,网上说JDK版本太高,改低,还是失败. 由于本人有个习惯,更喜欢把项目直接放入tomcat webapps 里 ...

  8. org.hibernate.QueryException: could not resolve property

    org.hibernate.QueryException: could not resolve property HibernateSQLXML  org.hibernate.QueryExcepti ...

  9. J2EE 关于WebLogic下应用使用URL.openConnection获取连接返回 HttpsURLConnection与SOAPHttpsURLConnection的问题

    J2EE 关于WebLogic下应用使用URL.openConnection获取连接返回 HttpsURLConnection与SOAPHttpsURLConnection的问题 2012年03月09 ...

随机推荐

  1. 一脸懵逼学习Nginx及其安装,Tomcat的安装

    1:Nginx的相关概念知识: 1.1:反向代理: 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到 ...

  2. net-snmp 安装与trap调试

    https://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.3/

  3. F. 数学上来先打表

    题解: 搞这题搞了一天 思维不是很难 就是暴力压位bitset 分块做法速度更快 但是stl里的不能实现这个功能 所以手动实现 64位压一位 到65535跑一下1的个数 然后(x>>16) ...

  4. 【CF809D】Hitchhiking in the Baltic States

    题意: 给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足t1<t2<...<tlent1<t2<...<tlen.最 ...

  5. linux 锁定重要文件 更改重要命令

    锁定重要文件如下: chattr +i /etc/passwd /etc/shadow /etc/groupp /etc/gshadow 解锁文件 chattr -i /etc/passwd /etc ...

  6. 常见内网IP段

    以下IP段为内网IP段: 192.168.0.0 - 192.168.255.255 172.16.0.0 - 172.31.255.255 10.0.0.0 - 10.255.255.255

  7. P1057 传球游戏 dp

    题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:nn个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个 ...

  8. 使用EndNote在Word中插入参考文献

    以百度文库为例,首先找到我们要插入的参考文献,比如 搜索关键词,然后下需要的论文下面点击引用 得到 点击下面导出链接的EndNote,会下载一个.enw文件 找到此文件并双击打开后即已经导入到EndN ...

  9. Java大数相加(多个大数相加)-hdu1250

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1250 题目描述: 题目大意是:已知一个Hat's Fibonacci序列,该序列满足F(1) = 1, ...

  10. BZOJ-5-4300: 绝世好题-位-DP

    思路 :题意描述我也很绝望 .先说一下题意 : 给定长度为n数组a [ ],求a[ ] 的一个最大子序列(可以不连续),使得b [ i ]& b [ i - 1 ] ! = 0.求最大的 b数 ...