項目從TOMCAT7移到WEBLOGIC12C後,出現異常org.hibernate.QueryException: ClassNotFoundException:
org.hibernate.hql.ast.HqlToken;
網上查了一下,是因為hibernate3.0是基於antlr的HQL/SQL查詢翻譯器,用到了antlr-x-x-x.jar,然而weblogic.jar中已經包含了antrl類庫,而且weblogic.jar的載入順序比項目下的jar載入順序有限,導致以上無法載入的錯誤。總歸就是說這個問題是因為類載入的先後順序造成的,解決方案如下都是基於改變載入順序的):
1、選擇Hibernate3.0的查詢翻譯器:
hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory;
選擇Hibernate2.1的查詢翻譯器
hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory;
要使用3.0的批次更新和刪除功能,只能選擇1;當使用的時候出現中文“過濾條件”的情況,只能選擇2。
這種方式指標不治本,可能還有其他載入問題。
2、將antlr-x-x-x.jar拷貝到java路徑和java擴充路徑下JAVA_HOME%/jre/lib/ext/);
3、改變jar載入優先順序,優先使用項目的jar報,在部署項目的weblogic.xml裡增加如下設定:
<container-descriptor>
<prefer-web-inf-classes>true</prefer-web-inf-classes>
</container-descriptor>。
4、修改% mydomain%\startWebLogic.cmd,修改set CLASSPATH ,使antlr-x-x-x.jar出現在前面;
附weblogic容器載入順序:
weblogic的web容器的classloader繼承自ejb容器的classloader,ejb容器又繼承自application classloade負責載入classpath下面的類),所以預設情況下classpath下面的類會被優先載入。weblogic中預設有以下幾個層級:
1、java路徑和java擴充路徑,這個算是層級最高的了;
2、系統類別路徑;
3、域下/lib,兩個或多個域下的類是不可見的;
4、WEB-INF/lib or WEB-INF/classes,這個是最低的層級。