相关推荐:关于安装QTP之后造成环境变量java冲突问题的解决方案

很多学习性能测试的朋友们都会有这样的问题,安装QuickTest Professional11之后,类似于Myeclipse打开弹出报错窗口,命令行(CMD)也无法正常显示javac、java命令的结果,错误如下图一、图二;图一图二那么如何处理呢?1.右键“计算机”,选择”属性“,左侧

公司应用项目在客户部署时经常遇到此类问题,为避免实施部署时增加配置量,花了点时间找到了此问题的终极解决办法(方案二、修改org.hibernate.hql.ast.HqlLexer的源代码)。在此进行记录本问题的分析解决方案。一、问题现象描述:1、异常信息:'weblogic.kernel.Default (self-tuning)']… org.hibernate.QueryException: ClassNotFoundException: org.hibernate.hql.ast.HqlToken [

at org.hibernate.hql.ast.HqlLexer.panic(HqlLexer.java:57)

at antlr.CharScanner.setTokenObjectClass(CharScanner.java:340)

at org.hibernate.hql.ast.HqlLexer.setTokenObjectClass(HqlLexer.java:31)

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)

at org.hibernate.hql.ast.HqlLexer.<init>(HqlLexer.java:26)

at org.hibernate.hql.ast.HqlParser.getInstance(HqlParser.java:44)

at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:242)

atorg.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:157)

at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111)

at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77)

at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56)

at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72)

at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:402)

at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:352)

at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)2、查询weblogic安装目录下的antlr包:3、应用中引用的是hibernate3和antlr_2.7.6的jar 二、原因分析根据以上异常信息查看hibernate及antlr的源代码:org.hibernate.hql.ast.HqlLexer的部分代码:public void setTokenObjectClass(String cl) {

super.setTokenObjectClass( HqlToken.class.getName() );

} 以上super.setTokenObjectClass 方法就是antlr.CharScanner类中定义的方法: public void setTokenObjectClass(String paramString) {

try {

this.tokenObjectClass = Utils.loadClass(paramString);

} catch (ClassNotFoundException localClassNotFoundException) {

panic("ClassNotFoundException: " + paramString);

} } 此方法的关键部分:Utils.loadClass(paramString);即在hibernate在解析hql是会采用此工具加载org.hibernate.hql.ast.HqlToken类(即HqlLexer类中的setTokenObjectClass方法)。此处会发生什么情况呢,请看Utils.loadClass的源代码:

static {

if ("true".equalsIgnoreCase(System.getProperty("ANTLR_DO_NOT_EXIT", "false")))

useSystemExit = false;

if ("true".equalsIgnoreCase(System.getProperty("ANTLR_USE_DIRECT_CLASS_LOADING", "false")))

useDirectClassLoading = true;

}

/** Thanks to Max Andersen at JBOSS and Scott Stanchfield */

public static Class loadClass(String name) throws ClassNotFoundException {

try {

ClassLoader contextClassLoader =Thread.currentThread(). getContextClassLoader();

if (!useDirectClassLoading && contextClassLoader!=null ) {

return contextClassLoader.loadClass(name);

}

return Class.forName(name);

}

catch (Exception e) {

return Class.forName(name);

}

}

从以上的代码可看处,加载org.hibernate.hql.ast.HqlToken类的类加载器是weblogic启动类加载器(不管是Thread.currentThread().getContextClassLoader()还是Class.forName,其中Class.forName采用的是Reflection.getCallerClass()的类加载器,即antlr的类加载器),并非应用类加载器。Weblogic类路径下已经存在antlr的jar包了,系统会优先使用weblogic下的antlr包,而weblogic类路径下并没有hibnate的jar包,所以在加载org.hibernate.hql.ast.HqlToken类是会抛出ClassNotFoundException: org.hibernate.hql.ast.HqlToken异常。

三、解决方案

方案一、修改weblogic类加载器中antlr加载的优先级拷贝应用中的包antlr-2.7.6.jar到%WL_HOME%\server\lib下

修改% mydomain%\startWebLogic.cmd(.sh) : 在set CLASSPATH之前加上下面一句: set PRE_CLASSPATH=%WL_HOME%\server\lib\antlr-2.7.6.jar; 在set CLASSPATH之后加上下面一句: set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH% 此方案并不总是有效(尤其是在osgi类型项目或者同一个weblogic域下部署多个项目的情况),当然根据笔者遇到的情况成功率也在95%以上。当此方案无效时可以采用方案二。

方案二、修改org.hibernate.hql.ast.HqlLexer的源代码:

加载org.hibernate.hql.ast.HqlToken类是,直接用hibernate所在类classload加载即可:

将原来的代码:

public

void setTokenObjectClass(String cl) {

super.setTokenObjectClass( HqlToken.class.getName() );

}

修改为:直接将hqltoken类赋值给this.tokenObjectClass

public void setTokenObjectClass(String cl) {

this.tokenObjectClass = HqlToken.class;}

相关推荐:解决WebLogic12C与Hibernate3.3的Antlr包冲突问题

环境配置:weblogic12C Struts2.1.8+Spring2.5+Hibernate 3.3 问题描述:项目在tomcat7下运行正常,但部署在WebLogic12C下运行时,就有如下异常: ClassNotFoundException: org.hibernate.hql.ast.HqlToken 语法解析器异常,提示找不到指定的Cla

快照源:http://www.cnblogs.com/bingjava/p/5342802.html