舊問題重談:Hibernate3與weblogic8的問題:org.hibernate.hql.ast.HqlToken

      最近兄弟的項目全省推廣了,幫着改來着,jdk1.6向那全省的破服務器中的jdk1.4降,使用的weblogic8.x,所以遇到幾年前大家都遇到的問題,可能現在最新的weblogic已解決這些問題(希望如此)。下面的方法爲本人所找的,但都試驗過!

      將使用Hibernate3.X的Web應用發佈到Weblogic8.X上, 一旦出現訪問數據庫的操作就會出錯, 提示CharScanner; panic: ClassNotFoundException: org.hibernate.hql.ast.HqlToken, 而且Weblogic進程會被自動關閉。

      經上網查證, 原因是: 在hibernate3中需要用到antlr.2.7.X.jar,然而這個包在weblogic.jar中已經包含了antrl類庫,就會產生一些類加載的錯誤,無法找到在war或者ear中的hibernate3.jar。而出現這個錯誤之後,antlr會調用System.exit(),這樣weblogic就會中止服務。

      歷史解決辦法:

      (I)選擇Hibernate2.1的查詢翻譯器
       hibernate.query.factory_class= org.hibernate.hql.classic.ClassicQueryTranslatorFactory

       弊端:不能執行如update、sum(*)/sum(*)等語句。在開發大型項目中不實際!

     

      (II)選擇Hibernate3.0的查詢翻譯器:
       hibernate.query.factory_class= org.hibernate.hql.ast.ASTQueryTranslatorFactory (僅修改這是不夠的)

       繼續:(a)將antlr-2.7.X.jar到Weblogic的pre_Classpath :用WinRar或Winzip打開C(請選擇你自己的安裝目錄):/bea/weblogic81/server/lib/weblogic.jar 刪除裏面的antlr目錄, 然後再antlr-2.7.X.jar放在weblogic.jar的同一目錄(注:替換之後沒做做過嚴格測試,尚不知是否有後遺症) ,本人測試到的後遺症是:以前編譯過的函數,查詢語句都可以用的,沒編譯過的查詢語句,它不再執行!

               (b)修改% mydomain% / startWebLogic.sh: 
       在set CLASSPATH之前加上下面一句:
         set PRE_CLASSPATH=%WL_HOME%/server/lib/antlr-2.7.5H3.jar;
       在set CLASSPATH之後加上下面一句:
        set CLASSPATH=%PRE_CLASSPATH%;%CLASSPATH%
       一切OK!

       弊端:每個版本的配置文件都不一樣,我用的配置文件就和這不一樣,所以我試了好幾種寫法,都以失敗而告終!有成功的,請告我聲,在此先謝謝了!

     (III)在自己的網站中WEB-INF中新建weblogic.xml文件,讓weblogic先識別該網站下的antlr.jar即可。

       <!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN""http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">

      <weblogic-web-app>
       <jsp-descriptor>
       <jsp-param>
       <param-name>pageCheckSeconds</param-name>
       <param-value>0</param-value>
       </jsp-param>
       <jsp-param>
       <param-name>encoding</param-name>
       <param-value>UTF-8</param-value>
       </jsp-param>
       </jsp-descriptor>
       <container-descriptor><!-- using web based class load order -->
       <prefer-web-inf-classes>true</prefer-web-inf-classes>
       </container-descriptor>
      </weblogic-web-app>

       弊端:這個方法我試過了,但別的*.xml文件讀取就成問題了,不知道大家有沒有遇到!

       (IV)最簡單的:大家在用Myeclipse(eclipse)時不是要配服務器的,在那配服務器的下面有個選項Paths,選擇Paths,選其中的Perpend to classpath,選Add JAR/ZIP,好了選擇你要加的antlr.2.7.X.jar,加進去,重新編譯,一切ok!

       簡單、方便,感謝eclipse吧,方便了我們的開發!但本人還未把項目部到服務器上,不知道到時直接用weblogic直接啓動會不會出現問題,還不清楚,希望不要再出現問題了!我都受不了了!期待吧。。。(有問題,本人會繼續補上解決辦法

       寫這博客只是總結,沒個人創新,只是方便大家不要走太多的彎路!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章