<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    David.Turing's blog

     

    [原創(chuàng)]Hibernate的Antlr在Weblogic中產(chǎn)生Jar沖突的歷史緣故以及解決辦法

    Hibernate使用的文法分析器是antlr,WebLogic同樣也是。
    不少用戶碰到ClassNotFoundException: org.hibernate.hql.ast.HqlToken的典型問題,這個典型問題已經(jīng)通過
    配置weblogic.xml,要求Web應用優(yōu)先加載WEB-INF的Jar(即應用Classloader)而非WebLogic的System Classloader得以勉強解決:
    <weblogic-web-app>
    ? <container-descriptor>
    ? ? <prefer-web-inf-classes>true</prefer-web-inf-classes>
    ? </container-descriptor>
    </weblogic-web-app>
    ?
    ?
    Hibernate 3.0的用戶發(fā)現(xiàn)上述的方法依然不能解決問題,因為Hibernate使用了Class.forName去Load一個類,而JVM加載類的方式是先System Classloader(WebLogic),后Application Classloader(Web應用),于是,應用即使采用prefer-web-inf-classes策略,但Class.forName還是Load了WebLogic的Antlr!!
    ?
    Hibernate 3.1迅速解決了這個問題,Hibernate會使用context classloader,Class.forName這種罪惡的代碼已經(jīng)被消除掉。
    ?
    無獨有偶,2005年,澳大利亞的Suncorp-Metway公司使用Hibernate3.0.3 + WebLogic8.1SP4開發(fā)他們的應用 , 當時的WebLogic 8.1SP4內置了antlr 2.7.1,跟Hibernate? 3.0.3捆綁的antlr-2.7.5H3.jar沖突,Suncorp-Metway公司希望改變WebLogic的SystemClassPath(加入antlr-2.7.5H3.jar),效果等于替換了WebLogic的Antlr,這當然能夠解決Hibernate的問題,但天知道會帶來什么問題,因為WebLogic自身會使用Antlr去分析EJBQL(如果不適用CMP,用戶完全可以不管3721,置換WebLogic的Antlr版本了之),Suncorp-Metway公司擔心這種替換對系統(tǒng)帶來其他影響,希望BEA仍然能夠提供技術支持。
    當時,作為BEA在澳大利亞昆士蘭州最大的BEA客戶,他們的建議當然受到足夠的尊重。 為此,BEA 8.1 SP4/SP5都提供了一個補丁,等同于升級了WebLogic 8.1自帶的Antlr的版本,WebLogic 8.1SP6以及WebLogic 9.1開始都沿用這個變更。
    ?
    很明顯,這種辦法不可能再次沿用到以后的SP,因為Antlr以及Hibernate的版本的更新速度遠遠高于WebLogic Service pack的更新速度,BEA不可能不斷地重構Antlr來適應開源日新月異的API變化。
    ?
    WebLogic 8.1 SP6之后,當使用Hibernate 3(策略是<prefer-web-inf-classes>true</prefer-web-inf-classes>)的Antlr 2.7.6時候,輪到WebLogic自身的Servlet容器出問題(Hibernate好了,WebLogic出事了)拋出如下的Antlr異常:
    java.lang.ClassCastException: antlr.CommonToken
    at antlr.CharScanner.makeToken(CharScanner.java:175)
    at weblogic.servlet.jsp.JspLexer.mWORD(JspLexer.java:4723)
    at weblogic.servlet.jsp.JspLexer.mXML_ATTRIBUTES(JspLexer.java:4309)
    at weblogic.servlet.jsp.JspLexer.mTAGLIB_DIRECTIVE_BODY(JspLexer.java:5034)
    at weblogic.servlet.jsp.JspLexer.mTAGLIB_DIRECTIVE(JspLexer.java:4905)
    at weblogic.servlet.jsp.JspLexer.mDIRECTIVE(JspLexer.java:4751)
    at weblogic.servlet.jsp.JspLexer.mSTANDARD_THING(JspLexer.java:2161)
    at weblogic.servlet.jsp.JspLexer.mTOKEN(JspLexer.java:1947)
    at weblogic.servlet.jsp.JspLexer.nextToken(JspLexer.java:1820)
    at weblogic.servlet.jsp.JspLexer.nextToken(JspLexer.java:1820)
    at weblogic.servlet.jsp.JspLexer.parse(JspLexer.java:963)
    at weblogic.servlet.jsp.JspParser.doit(JspParser.java:106)
    at weblogic.servlet.jsp.JspParser.parse(JspParser.java:234)
    at weblogic.servlet.jsp.Jsp2Java.outputs(Jsp2Java.java:125)

    這個問題是WebLogic Servlet容器沒有意識到Hibernate用戶對ANTLR的版本需求:
    1) 在老的Antlr 2.7.1中,WebLogic的Servlet容器使用antlr.CharScanner通過下面的方法 ?Class.forName(String className) 加載token,因為jsp編譯的classes本身是基于WebLogic系統(tǒng)Classloader,于是,Classloader當然使用WebLogic的Antlr版本(2.7.1),WebLogic沒有被Hibernate的Antlr(2.7.6)所影響,Class.forName轉型成System CL所規(guī)約的 antlr.CommonToken不會有問題。
    2) 而當WebLogic Antlr 2.7.1+Hibernate Antlr2.7.6一起使用的時候,Servlet容器在CharScanner使用 Class.forName(String, boolean, ClassLoader)去加載token,而第三個參數(shù)是注入了當前的應用的Classloader,即WebLogic被迫使用了Hibernate的Antlr 2.7.6,而最終會導致容器在將Antlr 2.7.6的 CommonToken轉型成Antlr 2.7.1的CommonToken出現(xiàn)java.lang.ClassCastException。
    ?
    這種情況,只能做兩件事情:
    1)向BEA索取此Case的補丁
    2)前置System ClassPath,讓新版本的Antlr永遠放在前面。
    ?
    ?
    講述了這么多東西,其實,最終想揭示的問題是,無論是Hibernate和WebLogic,在一開始的時候都沒有意識到開源代碼重構的重要性。早期的WebLogic確實已經(jīng)XML Parser付出版本沖突的代價,所以后期,很多XML包都被WebLogic重新Rename Package(重構代碼的一種方式)。 如果一開始,WebLogic就使用com.bea.opensource.antlr來讓自己的容器使用Antlr,ANTLR沖突的這些問題肯定不會出現(xiàn)。
    ?
    WebLogic 10確實開始大規(guī)模重構Jar包,不幸的是,這個世界上有一種潛規(guī)則叫做向后兼容,所以,<prefer-web-inf-classes>true</prefer-web-inf-classes>是我們J2EE初級階段仍然需要接受的現(xiàn)實,當然
    ,你可以期待另外一種技術解決此問題——OSGI,事實上,這個版本可能比我們想象的要快,或者就在WebLogic 12g。

    posted on 2008-07-04 23:24 david.turing 閱讀(7884) 評論(1)  編輯  收藏

    評論

    # re: [原創(chuàng)]Hibernate的Antlr在Weblogic中產(chǎn)生Jar沖突的歷史緣故以及解決辦法 2009-07-30 16:07 小池

    很到位,thanks  回復  更多評論   


    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     

    導航

    統(tǒng)計

    常用鏈接

    留言簿(110)

    我參與的團隊

    隨筆分類(126)

    隨筆檔案(155)

    文章分類(9)

    文章檔案(19)

    相冊

    搜索

    積分與排名

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 免费一级毛片正在播放| 亚洲不卡在线观看| 精品成在人线AV无码免费看| 中文字幕亚洲码在线| 国产亚洲精品久久久久秋霞| 久久成人国产精品免费软件| 国产精品亚洲色图| 亚洲an天堂an在线观看| 免费观看一级毛片| 久久综合九色综合97免费下载| 亚洲国产成人综合精品| 亚洲国产精彩中文乱码AV| 热99re久久免费视精品频软件| 国产猛男猛女超爽免费视频| 亚洲欧美黑人猛交群| 亚洲v高清理论电影| 免费成人午夜视频| 免费看国产成年无码AV片| 中国性猛交xxxxx免费看| 亚洲熟妇无码av另类vr影视| 久久亚洲AV无码精品色午夜麻| 国产高清在线免费视频| 99re免费在线视频| 国产免费高清69式视频在线观看| 亚洲一级特黄特黄的大片| 亚洲va无码手机在线电影| 无码不卡亚洲成?人片| 久久天天躁狠狠躁夜夜免费观看| 国产羞羞的视频在线观看免费| 国产精品自拍亚洲| 亚洲日韩精品国产3区| 亚洲日韩乱码久久久久久| 国产亚洲视频在线播放| 免费少妇a级毛片| 暖暖免费高清日本中文| 麻豆最新国产剧情AV原创免费| 国产精品免费AV片在线观看| 视频免费1区二区三区| 亚洲AV无码专区国产乱码不卡| 亚洲国产精品成人精品小说| 亚洲成人精品久久|