如何配置Apusic應(yīng)用服務(wù)器的類(lèi)裝載結(jié)構(gòu),實(shí)現(xiàn)jar包的類(lèi),訪(fǎng)問(wèn)classes中的類(lèi)(轉(zhuǎn)自王東明的文檔)
Apusic應(yīng)用服務(wù)器目前在默認(rèn)情況下是三層類(lèi)裝在體系(具體介紹可參考知識(shí)庫(kù)中的相關(guān)文檔)。但是,默認(rèn)情況下,因?yàn)橛脩?hù)的應(yīng)用部署并不是一個(gè)理想狀況,他的一個(gè)相同的類(lèi),經(jīng)常部署到j(luò)ar包中,同時(shí)又在classes中存在,因此三層類(lèi)裝載體系下,經(jīng)常出現(xiàn)ClassNotFound的情況。
典型的情況是:在很多的用戶(hù)代碼中,由于用戶(hù)代碼的設(shè)計(jì)考量不完善,經(jīng)常出現(xiàn)部署在WEB-INF/lib目錄下jar中的類(lèi)使用自身 ClassLoader裝載WEB-INF/classes下的類(lèi),此時(shí)容出現(xiàn)ClassNotFound異常,而這種情況在很多客戶(hù)應(yīng)用中是相當(dāng)普遍的。
但是,這種情況,在其他的應(yīng)用服務(wù)器中卻很少出現(xiàn)異常,據(jù)此,我們有一個(gè)參數(shù)可以對(duì)Apusic應(yīng)用服務(wù)器的類(lèi)裝在體系進(jìn)行設(shè)置,這樣,可以很大程度上避免出現(xiàn)ClassNotFound的問(wèn)題:
ServletClassLoader本身不再持有委派ClassLoader的實(shí)例,而持有一個(gè)delegate實(shí)例。所有行為都委派給delegate去完成,delegate有三種:
????SeparatedLoaderDelegate 分jsp、WEB-INF/classes和WEB-INF/lib三個(gè)層次的類(lèi)裝載體系
????IntegrateLoaderDelegate 分jsp和其他的兩個(gè)層次的類(lèi)裝載體系
????SimpleLoaderDelegate 不分層次,所有類(lèi)由一個(gè)ClassLoader裝載
有兩種方式可以配置delegate的類(lèi)型。
????1、在web.xml中增加ContextInitParameter
????<context-param>
????????<description>
????????</description>
????????<param-name>com.apusic.web.ServletClassLoaderDelegate</param-name>
????????<param-value>
????????????com.apusic.servlet.http.IntegrateLoaderDelegate</param-value>
????</context-param>
????這樣的配置有效范圍只有當(dāng)前應(yīng)用
????2、通過(guò)VM參數(shù)指定 -Dcom.apusic.web.ServletClassLoaderDelegate=com.apusic.servlet.http.IntegrateLoaderDelegate
????這個(gè)配置,所有的應(yīng)用都適用
????兩種都指定的情況下,以web.xml中定義的為準(zhǔn)
????沒(méi)有任何配置,使用默認(rèn)的SeparatedLoaderDelegate
注意,直到本篇文檔發(fā)稿為止(20071030),對(duì)于資源文件的處理在兩層和一層結(jié)構(gòu)下,如果在jar包和classes都存在該文件的情況下,先讀到是jar包中的資源文件。對(duì)于class則是先讀到的是classes中的。
[楊威補(bǔ)充]:
一個(gè)錯(cuò)誤的重現(xiàn):在開(kāi)源項(xiàng)目tobago中,訪(fǎng)問(wèn)http://localhost:6888/tobago/faces/overview/toolbar.jsp時(shí)會(huì)報(bào)java.lang.ClassNotFoundException: org.apache.myfaces.tobago.example.demo.actionlistener.SimpleTabChangeListener錯(cuò)誤。
錯(cuò)誤原因:jar包中的TabChangeListenerTag類(lèi)調(diào)用createTabChangeListener時(shí),要訪(fǎng)問(wèn)classes目錄下的SimpleTabChangeListener類(lèi)。由于類(lèi)裝載機(jī)制,部署在WEB-INF/lib目錄下jar中的類(lèi)使用自身ClassLoader 裝載WEB-INF/classes下的類(lèi)會(huì)出現(xiàn)ClassNotFound。
解決方法的補(bǔ)充:
Apusic4.x startapusic中添加啟動(dòng)參數(shù):
-Dcom.apusic.web.ServletClassLoaderDelegate=com.apusic.servlet.http.IntegrateLoaderDelegate
Apusic5.1 startapusic中添加啟動(dòng)參數(shù):
-Dcom.apusic.web.ServletClassLoaderDelegate=com.apusic.web.container.IntegrateLoaderDelegate
posted on 2008-03-04 16:52 zYx.Tom 閱讀(1215) 評(píng)論(1) 編輯 收藏