weblogic 下异常 org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken

项目之前在 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。

<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>
        <!--优先加载位于 Web 应用程序的 WEB-INF 目录中的类,然后再加载应用程序或系统类加载器中的类-->
        <prefer-web-inf-classes>false</prefer-web-inf-classes>
    </container-descriptor>
</weblogic-web-app>

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

Invocation of init method failed; nested exception is java.lang.LinkageError:
  loader constraint violation: when resolving field "DATETIME" the class loader (instance of weblogic/utils/classloaders/ChangeAwareClassLoader)
  of the referring class, javax/xml/datatype/DatatypeConstants, and the class loader (instance of <bootloader>) for the field's resolved type,
  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,如:

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 的问题):

<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>false</prefer-web-inf-classes>
        <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>
    </container-descriptor>
</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

时间: 2025-01-08 19:29:38

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

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

转自:http://www.programgo.com/article/68682994452/ 在做查询的时候,报出  org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken这  个错误(是通过数据源连接的) 解决方法如下: 如果你是通过eclipse启动weblogic的,那么依次点击windows-preferences-myeclipse workbench-servers-

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

最近开发遇到Eclipse编译器老是报出ClassNotFoundException:Org.hibernate.hql.ast.HqlToken [from User Where id=1] 的错误,百度一直无果,找不到解决方案.就FQ去google了一下,终于找到了解决方案.可能是因为 antlr-2.7.6.jar 包冲突导致无法载入或者是Eclipse无法把antlr-2.7.6.jar加入到classpath中. 解决的办法就是把antlr-2.7.6.jar 加入到  JAVA_HO

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

在项目中,会遇到一对多的实体关系映射,而恰恰又要查出关联的实体属性,在HQL中使用join语句关联两个实体对象,如下代码: 1 select new CustomerRequirement(c.pName,c.salesMan,c.pDate) from CustomerRequirement c inner join c.requirementDeatils r on c = c.requirementDeatils.customerRequirement 运行发现报如下错误: org.hib

数据库异常整理:org.hibernate.QueryException: could not resolve property: “mStation”

最近用hibernate作数据库查询,结果遇到问题: org.hibernate.QueryException: could not resolve property: 'mStation'of  经过各个步骤检查,还是没找到方法. 在此,整理一下这个问题的导致可能原因: 一.排查HQL语句中的类字段,看是否是java类中的字段,不要是数据库中的字段: 二.排查各个字段是否与类中字段一致,绝大多数可能是由于字段不匹配导致的问题: 三.如果以上两部都检查没有问题,那么很可能就是JavaBean命名

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

今天在GitHub上面看到一个有意思的项目,下载下来,使用tomcat部署失败,出现异常,网上说JDK版本太高,改低,还是失败. 由于本人有个习惯,更喜欢把项目直接放入tomcat webapps 里面直接部署,通过console观察部署状态.当时这么做,项目照常能走. 玩了一下项目之后,需要使用IDE 走DeBug看看流程,更改JDK,JRE版本之后,还是出现了这样的异常 五月 12, 2017 7:08:10 下午 org.apache.catalina.core.AprLifecycleL

Caused by: java.lang.ClassNotFoundException: org.hibernate.annotations.common.reflection.MetadataPro

1.错误描写叙述 信息: MLog clients using java 1.4+ standard logging. 2014-7-12 19:29:20 com.mchange.v2.c3p0.C3P0Registry banner 信息: Initializing c3p0-0.9.2.1 [built 20-March-2013 10:47:27 +0000; debug? true; trace: 10] 2014-7-12 19:29:21 org.springframework.w

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

J2EE 关于WebLogic下应用使用URL.openConnection获取连接返回 HttpsURLConnection与SOAPHttpsURLConnection的问题 2012年03月09日 ⁄ 综合 ⁄ 共 1353字 ⁄ 字号 小 中 大 ⁄ 评论关闭 做集成工作时使用到了第三方公司提供的接口JAR包,在本地TOMCAT测试通过后部署到WEBLOGIC上.抛出了weblogic.net.http.SOAPHttpsURLConnection cannot be cast to j

WebLogic下Argument(s) &quot;type&quot; can&#39;t be null.

启动项目出现Argument(s) "type" can't be null.异常.异常如下: java.lang.IllegalArgumentException: Argument(s) "type" can't be null. at com.sun.xml.bind.api.TypeReference.<init>(TypeReference.java:93) at com.sun.xml.ws.model.RuntimeModeler.proc

Caused by: java.lang.ClassNotFoundException: org.hibernate.engine.FilterDefinition

1.错误描述 java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition; at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2570) at java.lang.Class.getDeclaredMethods(Class.java:1855)