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

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

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

    The NoteBook of EricKong

      BlogJava :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
      611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

    Java本身是一種設(shè)計(jì)的非常簡(jiǎn)單,非常精巧的語(yǔ)言,所以Java背后的原理也很簡(jiǎn)單,歸結(jié)起來(lái)就是兩點(diǎn):

    1、JVM的內(nèi)存管理

    理解了這一點(diǎn),所有和對(duì)象相關(guān)的問(wèn)題統(tǒng)統(tǒng)都能解決

    2、JVM Class Loader

    理解了這一點(diǎn),所有和Java相關(guān)的配置問(wèn)題,包括各種App Server的配置,應(yīng)用的發(fā)布問(wèn)題統(tǒng)統(tǒng)都能解決


    App Class Loader
    |----- EJB Class Loader
    |----- Web App Class Loader


    如果在App Class Loader級(jí)別配置,是全局可見(jiàn)的。如果打包在EJB里面,那么就不會(huì)影響到Web Application,反之亦然,如果你在WEB-INF下面放置Hibernate,也不會(huì)影響到EJB。放在EJB Class Loader或者放在Web App Class Loader級(jí)別主要就是在局部范圍內(nèi)有效,不影響到其它的應(yīng)用。

    試想,如果在一個(gè)Weblogic上面配置多個(gè)虛擬域,你使用www.bruce.com域名,開(kāi)發(fā)你的網(wǎng)站,我使用www.fankai.com開(kāi)發(fā)我的網(wǎng)站,那么當(dāng)然不希望我們的Hibernate相互干擾,所以就可以放在 EJB Class Loader級(jí)別來(lái)配置Hibernate。

    進(jìn)一步闡述一下EJB Class Loader的問(wèn)題:

    先再次強(qiáng)調(diào)一下,Hibernate和EJB,和App Server不存在兼容性問(wèn)題,他們本來(lái)就是不相關(guān)的東西,就好像JDBC,相信沒(méi)有人會(huì)認(rèn)為JDBC和EJB不兼容吧,Hibernate也是一樣,它只和JDBC驅(qū)動(dòng),和數(shù)據(jù)庫(kù)有兼容性問(wèn)題,而和EJB,和App Server完全是不搭界的兩回事。凡是認(rèn)為Hibernate和EJB不兼容的人,其實(shí)是都是因?yàn)閷?duì)EJB學(xué)習(xí)的不到家,把責(zé)任推到Hibernate身上了。

    我前面的帖子提到過(guò)Class Loader的層次,這里不重復(fù)了,總之我們先來(lái)看看Class Loader的作用范圍:

    BootStrap Class Loader:

    load JRE\lib\rt.jar, sunrsasign.jar, charsets.jar, jce.jar, jsse.jar, plugin.jar

    Ext Class Loader:

    load JRE\lib\ext目錄下的庫(kù)文件, load JRE\classes目錄下的類

    App Class Loader:

    load CLASSPATH變量指定路徑下的類

    以上的load路徑都是寫死在JVM的C++源代碼里面的,不能改變, 

    在一個(gè)特定的App Server上,Class Loader會(huì)繼續(xù)向下繼承,繼承的層次會(huì)根據(jù)不同的App Server有所不同,但是肯定不會(huì)變的就是:

    EJB Class Loader:

    繼承自App Class Loader,繼承層次根據(jù)App Server有所不同,一個(gè)EJB Class Loader它的load Class的范圍僅限于JAR或者EAR范圍之內(nèi)。

    Web App Class Loader:

    繼承自App Class Loader,繼承層次根據(jù)App Server有所不同,一個(gè)Web App Class Loader:它的load Class的范圍在 WEB-INF\lib下的庫(kù)文件和WEB-INF\classes目錄下的class文件。

    Web App Class Loader很好理解,大家畢竟用的很多,App Server上的一個(gè)Web Application會(huì)創(chuàng)建一個(gè)Web App Class Loader的實(shí)例去負(fù)責(zé)load class,所以如果你想讓Hibernate只在這個(gè)Web Application內(nèi)生效,把它放到WEB-INF\lib下去就好了。

    如果你把Hibernate放到了CLASSPATH變量指定的路徑下,而你在WEB-INF\lib也放了一份,那么Web App Class Loader由于load范圍所限,它會(huì)首先找到WEB-INF\lib下的那份Hibernate,按照它的配置來(lái)初始化Hibernate。

    如果你把Hibernate放到了CLASSPATH變量指定的路徑下,但你在WEB-INF\lib什么都沒(méi)有放,那么Web App Class Loader由于load范圍所限,它根本什么都找不到,于是它把load Hibernate的責(zé)任交給上一級(jí)的Class Loader,這樣直到App Class Loader,它找到了Hibernate,按照它的配置來(lái)初始化Hibernate。

    EJB Class Loader稍微復(fù)雜一點(diǎn),不那么容易理解。App Server會(huì)針對(duì)每一個(gè)EJB包文件創(chuàng)建一個(gè)EJB Class Loader的實(shí)例,例如:

    HelloRobbin.jar
    HelloBruce.jar

    當(dāng)你把這兩個(gè)jar發(fā)布到App Server上以后,會(huì)創(chuàng)建兩個(gè)EJB Class Loader的實(shí)例,分別去load這兩個(gè)EJB包,比如說(shuō):

    CLEJB_Robbin是load HelloRobbin.jar的
    CLEJB_Bruce是load HelloBruce.jar的

    那么CLEJB_Robbin的load范圍就僅僅限于HelloRobbin.jar之內(nèi),它load不到HelloRobbin.jar之外的任何文件,當(dāng)然它也load不到HelloBruce.jar。

    說(shuō)到這里,我相信大家應(yīng)該已經(jīng)明白為什么EJB規(guī)范不允許EJB有IO操作了吧?因?yàn)镋JB Class Loader根本找不到j(luò)ar包之外的文件?。。?

    如果現(xiàn)在你想實(shí)現(xiàn)HelloRobbin.jar和HelloBruce.jar的互相調(diào)用,那么該怎么辦?他們使用了不同的EJB Class Loader,相互之間是找不到對(duì)方的。解決辦法就是使用EAR。

    現(xiàn)在假設(shè)HelloRobbin.jar和HelloBruce.jar都使用了Hibernate,看看該怎么打包和發(fā)布:

    HelloEJB.ear
    |------ HelloRobbin.jar
    |------ HelloBruce.jar
    |------ Hibernate2.jar
    |------ pojo.jar (定義所有的持久對(duì)象和hbm文件的jar包)
    |------ cglib-asm.jar
    |------ commons-beanutils.jar
    |------ commons-collections.jar
    |------ commons-lang.jar
    |------ commons-logging.jar
    |------ dom4j.jar
    |------ odmg.jar
    |------ log4j.jar
    |------ jcs.jar
    |------ hibernate.properties
    |------ log4j.properties
    |------ cache.ccf
    |------ META-INF\application.xml (J2EE規(guī)范的要求,定義EAR包里面包括了哪幾個(gè)EJB)

    除此之外,按照EJB規(guī)范要求,HelloRobbin.jar和HelloBruce.jar還必須指出調(diào)用jar包之外的類庫(kù)的名稱,這需要在jar包的manifest文件中定義:

    HelloRobbin.jar
    |------ META-INF\MANIFEST.MF

    MANIFEST.MF中必須包括如下一行:

    Class-Path: log4j.jar hibernate2.jar cglib-asm.jar commons-beanutils.jar commons-collections.jar commons-lang.jar
    commons-logging.jar dom4j.jar jcs.jar odmg.jar jcs.jar pojo.jar

    這樣就OK了,當(dāng)把HelloEJB.ear發(fā)布到App Server上以后,App Server創(chuàng)建一個(gè)EJB Class Loader實(shí)例load EAR包里面的EJB,再根據(jù)EJB的jar包里面的MANIFEST.MF指出的Class-Path去尋找相應(yīng)的jar包之外的類庫(kù)。

    所以一個(gè)EAR包有點(diǎn)類似一個(gè)Web Application,EJB Class Loader的load范圍也就是EAR范圍之內(nèi),它load不到EAR之外的文件。除非把Hibernate定義到CLASSPATH指定的路徑下,在這種情況下,EJB Class Loader找不到Hibernate,只能交給上一級(jí)的Class Loader,最后由App Class Loader找到Hibernate,進(jìn)行初始化。

    沒(méi)有寫完,繼續(xù)說(shuō)...

    由于EAR這樣load Class規(guī)則,假設(shè)Robbin和Bruce都在同一個(gè)Weblogic上運(yùn)行自己的網(wǎng)站,而我們都不希望自己的程序里面的Hibernate配置被對(duì)方的搞亂掉,那么我們就可以這樣來(lái)做:

    Robbin's Website:

    Robbin.ear
    |-------- robbin.war (把Web Application打包)
    |-------- robbin.jar (把開(kāi)發(fā)的EJB打包)
    |-------- Hibernate2.jar
    ..........................
    |-------- META-INF\application.xml


    Bruce's Website:

    Bruce.ear
    |-------- bruce.war (把Web Application打包)
    |-------- bruce.jar (把開(kāi)發(fā)的EJB打包)
    |-------- Hibernate2.jar
    ..........................
    |-------- META-INF\application.xml

    這樣在同一個(gè)App Server上運(yùn)行,就可以互相不干擾。


     

    posted on 2011-12-27 15:58 Eric_jiang 閱讀(136) 評(píng)論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费在线观看a级毛片| 99久久人妻精品免费二区| 亚洲精品无码久久久久秋霞| 亚洲精品国产情侣av在线| 内射干少妇亚洲69XXX| 亚洲国产精品lv| 亚洲免费在线视频| 久久亚洲日韩看片无码| 亚洲美女视频一区二区三区| 亚洲精品视频观看| 亚洲成无码人在线观看| 亚洲三级在线免费观看| 亚洲中文字幕AV每天更新| 亚洲国产AV无码一区二区三区| 亚洲精华国产精华精华液好用 | 性一交一乱一视频免费看| 嫩草视频在线免费观看| 日本免费高清一本视频| 免费中文字幕在线| 亚洲中文字幕无码久久综合网| 国产AV无码专区亚洲精品| 亚洲午夜精品一区二区| 亚洲综合一区无码精品| 狠狠综合亚洲综合亚洲色| 九九久久国产精品免费热6| 国产成人AV免费观看| 99久久精品免费精品国产| 国产1024精品视频专区免费| 国产精品极品美女免费观看| 亚洲女人被黑人巨大进入| 亚洲2022国产成人精品无码区| 亚洲另类图片另类电影| 国产成人人综合亚洲欧美丁香花| 一道本不卡免费视频| 18禁黄网站禁片免费观看不卡| 午夜免费福利在线| 国产精品亚洲玖玖玖在线观看 | avtt亚洲天堂| 亚洲精品卡2卡3卡4卡5卡区| 亚洲色av性色在线观无码| 午夜亚洲WWW湿好爽|