


版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Tomcat解析之初始化類加載器(截圖)全部 Hibernate Spring Struts iBATIS 企業(yè)應(yīng)用 Lucene SOAJava 綜合設(shè)計(jì) 模式 Tomcat OOJBoss?上一頁(yè)1 2下一頁(yè)?瀏覽7744次鎖定老帖子 主題:Tomcat解析之初始化類加載器(截圖)該帖已經(jīng)被評(píng)為精華帖作者正文發(fā)表時(shí)間:2010-01-30最后修改:2010-02-01國(guó)< > 獵頭職位:上海:【上?!客赓Y企業(yè)高新誠(chéng)聘 web開發(fā)工程 師囹相關(guān)文章:源代碼分析一一啟動(dòng)過程(二)« Tomcat源代碼分析之ClassLoader«How Tomcat Works
2、翻譯(7)之Tomcat類加載器續(xù)集 gogole_09推薦群組:Tapestry等更多相關(guān)推薦級(jí):CHjava綜合*性之前有寫過關(guān)于tomcat中常用的一些類結(jié)構(gòu)的文章。別:樣 解析Tomcat之HttpServlet( 截圖記錄)*文章:今天來關(guān)注一下,tomcat的類加載器相關(guān)的內(nèi)容。213積 PS:由于前一篇文章內(nèi)容比較簡(jiǎn)單,有朋友冠以我標(biāo)題黨之嫌,分:對(duì)于此種說法,本人深感抱歉,可能標(biāo)題確實(shí)有點(diǎn)大,但是這些常 420用的類,我更多的時(shí)候只關(guān)注其用法,而忽略了內(nèi)部實(shí)現(xiàn),所以也來 就把這些內(nèi)容總結(jié)了一下,發(fā)了出來。別無(wú)標(biāo)題黨之意,請(qǐng)各位eyer 自:海涵。杭州OK,現(xiàn)在進(jìn)入正題.Tomc
3、at類加載器初始化.開始之前,我們首先需要了解一下幾個(gè)基本的知識(shí)點(diǎn);1. tomcat中類加載器的結(jié)構(gòu)與關(guān)系。這里,我引用tomcat文檔的一個(gè)簡(jiǎn)圖來說明一下,有興趣深究的朋友,可以去翻看tomcat的文檔,理解更多信息.作者正文(tomcat5.5)(由于參考的是tomcat6.0的源代碼,這里糾正一下類加載器的 圖(如下),以免給別的朋友造成誤解,同時(shí)也多謝asialee給出的提醒)BootstrapISystemICommon/ Webappl WebappZ * *(tomcat6.0)2. 每種類加載器分別加載什么資源:這些內(nèi)容,可以在tomcat文檔的 Class Loader H
4、OW-TO找到這里我要說明的是,在tomcat中,這些內(nèi)容是記錄在哪里的。既(程序怎么讓tomcat知道,需要加載哪些類)答案是-其通過一個(gè)配置文件來指定的:(catali perties),這個(gè)文件默認(rèn)存放在tomcat 路徑下的 bin/bootstrap.jar 中。如圖打開文件,其內(nèi)容如下:Java代碼門1. # Licensed to the Apache Software Foundation(ASF) un der one or more2. # contributorlicenseagreements.See the NOTICE file distributed
5、with3. # this work foradditionalinformationregarding copyright own ership.4. # The ASF licenses this file to You under the Apache License, Version2.05. # (the "License");you may notexcept in complia nee withusethisfile6.#theLicense.You may obtainacopyof the Lice nse at7.#8.#/LICENSE-2.09.#
6、10.#Uni essrequired by applicablelaworagreedto in writi ng,software11.#distributedun der the Lice nseisdistributedon an "AS IS" BASIS,12. # WITHOUT WARRANTIESOR CONDITIONS OF ANY KIN D, either express or implied.13. # See the License for the specificIanguagegover ningpermissi onsand14.#lim
7、itati onsun der theLice nse.15.#16.#Listofcomma-separated packagesthatstartwithorequal this stri ng17.#willcause a securityexcepti ontobe thrown when18. # passed to checkPackageAccess uni ess the19. # corresp ondingRun timePermissio n("accessClass InPackage."+package) has20. # bee n gran t
8、ed.21. package.access=s un .,s un .bea ns.22.#23.#Listofcomma-separated packagesthatstartwithorequalthis stri ng24.#willcause asecurityexcepti ontobe thrown when25.# passed to checkPackageDefi niti onuni ess the26. # corresp ondingRun timePermissio n("defi neClass InPackage."+package) has2
9、7. #bee n gran ted.28. #29. #by default, no packages are restricted fordefi niti on,and none of30. #the class loaders supplied with the JDK caIIcheckPackageDefi niti on.31. #32. package.defi niti on=sun .java.,33. #34. #35. #List of comma-separated paths defi ning thecontents of the "com mon&qu
10、ot;36. #classloader. Prefixes should be used to define what is the repository type.37. #Path may berelativeto theCATALINA_HOMEor CATALINA_BASEpath or absolute.38. #If left asblank,theJVM systemloaderwill be used as Catali na's"com mon"39. #loader.40. #Examples:41. #"foo":Add
11、this folder as a classrepository42. #"foo/*.jar":Add all the JARs of the specified folder as class43. #repositories44. #"foo/bar.jar":Add bar.jar as a class repository45. com mon.lo ader=$catali na.home/lib,$catali na.home/lib/*.jar46. #47. #List of comma-separated paths defi nin
12、g thecontents of the "server"48. #classloader. Prefixes should be used to define what is the repository type.49. #Path may be relative to the CATALINA_HOMEor CATALINA_BASEpath or absolute.50. #If left as blank,the "common" loader willbe used as Catali na's "server"5
13、1. #loader.52. #Examples:53. #"foo":Add this folder as a classrepository54. #"foo/*.jar":Add all the JARs of the specified folder as class55. #repositories56. #"foo/bar.jar":Add bar.jar as a class repository57. server.loader=58. #59. # List of comma-separated paths defi
14、 ning the contents of the "shared"60. # classloader. Prefixes should be used to def ine what is the repository type.61. # Path may be relative to the CATALINA_BASE path or absolute. If left as bla nk,62. # the "common" loader will be used as Catalin a's"shared" load
15、er.63. # Examples:64. #"foo":Add this folder as a classrepository65. #"foo/*.jar":Add all the JARs of the specified folder as class66. #repositories67. #"foo/bar.jar":Add bar.jar as a class repository68. # Please n ote that for si ngle jars, e.g. bar .jar, you need the
16、URL form69. # starti ngwith file:.70. shared .lo ader=71. #72. # Stri ng cache con figurati on.73. #74. #75. #此文件,下面會(huì)有詳細(xì)的介紹.OK,到此,我們初步了解到tomcat關(guān)于類加載器的一些知識(shí)鎖定老帖子 主題:Tomcat解析之初始化類加載器(截圖)該帖已經(jīng)被評(píng)為精華帖 作者正文來詳細(xì)看看,tomcat內(nèi)部是怎么來初始化這些類加載器的吧.首先,我們知道,java程序都需要一個(gè)入口 (main方法),而 在tomcat中,這個(gè)入口在這個(gè)類中??雌浣Y(jié)構(gòu):定位到萬(wàn)法內(nèi)部:Java代碼門
17、1. public static void main(String args) 2. if(daem on = n ull)3.4.5.源(今天來了解的.10.3. 4. try6.s.le ngth- 1;17.18.)19.daemon = new Bootstrap。;try /初始化資)daem on .i nit(); catch (Throwable t) t.pri ntStackTrace(); return;/默認(rèn)為啟動(dòng)Stri ngcomma nd = "start"if(args .len gth> 0)comm
18、a nd = argsargif(comma nd.equals("startd"argsargsen gth-正文20.1= "start"daem on.lo ad(args);21.daem on. start();22.elseif(comma nd.equals("stopd")23.argsargsen gth-1= "stop"24.daem on. stop();25.elseif(comma nd.equals("start")26./設(shè)置標(biāo)識(shí)27.);daem on. set
19、Await(true28.daem on.lo ad(args);29./開啟30.daem on. start();31.elseif(comma nd.equals("stop")32.daem on. stopServer(args);33.else34.log.warn("Bootstrap:comma nd ""+comma nd +"" does not exist35.);36.catch(Throwable t) 37.t.pri ntStackTrace();38.39.在tomcat啟動(dòng)之前,需要初始化一
20、些系統(tǒng)資源,初始化的詳細(xì)工作都定義在init()方法內(nèi)部了。0K,我們繼續(xù)追蹤一下。 定位到init()方法中Java代碼笆1. public voidinit()2. throwsExcepti on該帖已經(jīng)被評(píng)為精華帖正文3.4.徑/ SetCatali napath設(shè)置catalina 基本路5.setCatali naHome();6.setCatali naBase();7./初始化類加載器8.in itClassLoaders();9.Thread.curre ntThread().setC on textClassLoader(catali naLoader);10.Securi
21、tyClassLoad.securityClassLoad(catali naLoader);11./ Load our startupclass and call its process() method12.if(log.isDebugE nabled()13.log.debug("Load ingstartup class")14.Jlass("");Class startupClass=catali naLoader.loadC15.Objectstartup In sta nee=startupClass .newIn sta nce();16
22、./ Set the shared exte nsionsclass loader17.if(log.isDebugE nabled()18.log.debug("Sett ingstartup classproperties");19.String methodName = "setPare ntClassLoader20. Class paramTypes = new Class 1;21. paramTypes0 = Class.forName("");22. Object paramValues = new Object 1;23. p
23、aramValues 0= sharedLoader;24. Method method =startupI nsta nce.getClass(). getMethod(methodName, paramTypes);25. method.i nv oke(startup In sta nee,paramValues)26. catali naDaem on= startup In sta nee;27. 可以看到,上面的代碼中,用來初始化類加載器、驗(yàn)證類加載作者正文器、以及使用類加載器來加載類""等等操作。這篇文章,主要來探討一下,tomcat初始化類加載器的方式,所以
24、,我們追蹤到方法in itClassLoaders() 中:這里主要介紹一下,下面的流程,tomcat會(huì)調(diào)用in itClassLoaders()方法。用來初始化commoncatalina,shared三種類加載器,而這個(gè)操作是通過方法createClassLoader(Stri ng n ame, ClassLoader pare nt)來完成的。而后2個(gè)都屬于commons子級(jí),所以下面給出2個(gè)方法的源代碼(其中相關(guān)信息,都以注釋給出):Java代碼門1. /*2.*初始化類加載器:3.*加載三種:4.*com mon.5.*/6.*catali nashared.7.*/8.priva
25、te void in itClassLoaders()9.try 10./創(chuàng)建common類加載器11.com mon Loader = createClassLoader("commo n",n ull);12.rif(com mon Loader = null )13./ no config file,default tothisloader - we might be in a'si ngle' mon Loader=this.getClass().getClassLoader();正文15.16./ 倉(cāng)U建 catalina類加載
26、器,指疋其父級(jí)別的加載器為com mon Loader.17.catali naLoader=createClassLoader("server",com mon Loader);18./創(chuàng)建sharedLoader類加載器,指定其父級(jí)別的加載器為commo nLoader.19.sharedLoader =createClassLoader("shared",com mon Loader);20. catch (Throwable t)21.log.error("Classloader creati onthrewexcepti on&quo
27、t;,t);22.System.exit( 1);23.24.Java代碼門1. /*.器.ng10.11.*創(chuàng)建類加載器* param n ame* param pare nt指定上一級(jí)別的類加載* return* throws Exception*/private ClassLoader createClassLoader(Stri n ame, ClassLoader pare nt)throws Excepti on/這里以common例:從catali perties中獲取common.loader類加載信息丿 111、12./ 女口:13.
28、/com mono ader=$catali na.home/lib ,$catali na.home/lib/*.jar14. Stri ng value = Catali naProperties.getPropert y(n ame+ "o ader");15. /如果沒有任何信息,則返回父加載器16.if (valuen ull) | (value.e正文quals("")17.18.ew ArrayList();19.ArrayList();20.21.22.returnpare nt;ArrayListrepositoryLocati ons
29、ArrayListrepositoryTypes=n newint i;/以逗號(hào)分隔.Strin gToke ni zertoke nizernewStri ngToke nizer(value,23. while 24.izer. nextToke n();25.26.",");(toke nizer.hasMoreEleme nts()Stri ng repository = toke n/ Local repository boolea n replace = false;27. Stri ng before= repository;28. /是否含有"$c
30、atali na.home"29.while(i=repository.i ndexOf(CATALINA_HOME_TOKEN)0>= 30.replace=true;31.if (i> 0) 32.tomcat路徑替換后的形式如下: c:/ope nsource/tomcat5/lib./替換成33.repository= repository.substri ng( 0,i)+ getCatali naHome()34.+ repository.substri ng(i+CATALINA_HOME_TOKEN.Ie ngth();35. else 36. repos
31、itory =getCatali naHome()37. + r epository.substri ng(CATALINA_HOME_TOKEN.Ie ngth();38. 39. 40. /是否含有(i=repository.i ndexO replace=true;if (i> 0) /同上,替"$catali na.base"41. while f(CATALINA_BASE_TOKEN)>= 42.43.44.換42. repository = repository.substri ng( 0,i)+ getCatali naBase()43. + r
32、epositor y.substri ng(i+CATALINA_BASE_TOKEN.Ie ngth();44. else 45. repository =getCatali naBase()46. + repository.substri ng(CATALINA_BASE_TOKEN.Ie ngth();50.51.52.gEn abled()if53."+ before+ " to "54.repository/55.try56.pository);57.add(repository);58.ClassLoaderFactory.lS_URL);59.60.
33、tio n e) 61.62.63.jar")if64.itory.substri ng(replace && log.isDebu log.debug("Expa nded+ repository);Check for a JAR URL URL url=new URL(re repositoryLocati ons. repositoryTypes.add( con ti nue;catch (MalformedURLExcep/ Ignore(repository.e ndsWith("*.repository = repos正文65.(0,
34、 repository.le ngth()- "*.jar".le ngth();66.add(repository);repositoryLocati ons.67.ClassLoaderFactory.lS_GLOB);repositoryTypes.add(68. elseif (repository.e ndsWith(".jar")69.add(repository);repositoryLocati ons.70.ClassLoaderFactory.lS_JAR);repositoryTypes.add(71. else72.add(rep
35、ository);repositoryLocati ons.73.ClassLoaderFactory.IS DIR);repositoryTypes.add(74.75.76.Stri nglocati ons= (Stri ng)repositoryLocatio ns.toArray( newString 0);77.In tegertypes=(In teger)repositoryTypes.toArray(newInteger 0);78./創(chuàng)建類加載器79.ClassLoader classLoader = ClassLoaderFactory.createClassLoader
36、80.(locati ons, types, pare nt)81./RetrievingMBean server83.if(MBea nServerFactory.fi ndMBea nServer(n ull).size()> 0)84.mBea nServer =85.(MBea nServer) MBeanServerFactory.fi ndMBea nServer( null).get(0);86. else 87.mBea nServer =Man ageme ntFactory.getPlatformMBea nServer();88.89./ Register the
37、server classload82.MBeanServer mBeanServer = nuII;正文er90. ObjectName objectName =91. new ObjectName("Catalina:ty pe=ServerClassLoader, name=" + n ame);92. mBea nServer.registerMBea n( classLoade r, objectName);93. retur n classLoader;94. 到這里,我們可以確定,tomcat文檔中的類加載器之間關(guān)系是準(zhǔn) 確的,并非憑空說的。到這里,我們可能對(duì)于
38、createClassLoader() 方法的Java代碼門1. CatalinaProperties.getProperty(name+ ".loader");有點(diǎn)疑問,到底tomcat是如果通過配置文件來獲取需要初始化 類加載器的相關(guān)信息的呢/前面我們看到 perties中記錄了 tomcat三種類加載器中分別需要加載一些什么類的信息。而CatalinaProperties類正是用來解析此文件的,以告訴tomcat,哪種類加載器,加載哪些類。我們來看看這個(gè)類的源代碼:Java代碼門總1. /*2. * Utility class to read
39、the bootstrap Catal ina con figurati on.3. * 讀取 tomcat 的配置文件 perties4. * author Remy Maucherat5. * version $Revision: 467222 $ $Date: 2006-10-2411:17:11+0800 (星期二,24 十月 2006)$6. */7. publicclassCatali naProperties8./ -Static Variables9.privatestaticlog=10.Catali naProperties.class);11.pr
40、ivatestaticPropertiespropertiesnull;12.static13.loadProperties();14.15./ -Public Methods16./*17.* Retur nspecifiedproperty value.18.*/19.publicstaticStri nggetProperty(Stri ngn ame)20.retur nproperties.getProperty (n ame)21.J22./*23.* Retur nspecifiedproperty value.24.*/25.publicstaticStri nggetProp
41、erty(Stri ngn ame,Stri ngdefaultValue)26.retur nproperties.getPropert y(n ame,defaultvalue);27.28./ Public Methods29./*30.*加載配置信息31.* Load properties.32.*/33.private staticvoid loadProperties()34.In putStream is = n ull;35.Throwable error = nu II;36./第一步:從系統(tǒng)變量中查找37.try 38./getC on figUrl()方法的內(nèi)容為:Sys
42、tem.getProperty("catali na.c on fig");正文39.Stringcon figUrl= getConfigUrl();40.if(con figUrl!=null)41.is =(newURL(co nfigUrl).ope nStream();42.43.catch(Throwablet) 44./Ignore45.46./第二步:再?gòu)膖omcat的 conf目錄下去找47.if(is :=n ull)48.try 49.Filehome=newFile(getCatali naBase();50.File conf = newFile(
43、home, "co nf");51.File properties=new File(conf."catali perties");52.is = new FileInputStream(properties);53.catch (Throwable t) 54./ Ignore55.56.57./還沒找到:則從類路徑中加載.58.if(is =:=n ull)59. try 60. is =61.("/org/apache/catali na/startup/catali perties");62. catc
44、h (Throwable t) 6.文件中加載過來67./ Ignoreif (is != n ull) /到這里的話,如果找到了,就將配置2.93.該帖已經(jīng)被評(píng)為精華帖正文Properties。;try properties = newproperties .lo ad(is);is.close(); catch (Throwable t) if null) error = t;(is = n ull) | (error !=c
45、atali perties"./ Do something log.war n("Failed error);/ That's fineto load- we have reas on perties=new Properties()統(tǒng)變量./將配置文件的key-value 設(shè)置為系/ Register the properties as system properties=propertEnu merati onenu meratio pertyNames();while(enu merati on .h
46、asMoreEleme nts()String n ame = (Stri ng)enu merati on.n extEleme nt();Stri ngvalue = properties.getPropert y(n ame);if (value != n ull) System.setProperty(name, value);/*en vir onmentvariable.95.*/96.privatestaticStri ng getCatali naHome()97.returnSystem.getProperty("catali na.home",98.Sy
47、stem.getProperty("user.dir");94.Get the value of the catalina.home99.100./*101.* Get thevalue ofthe catali na.baseen vir onmentvariable.102.*/103.privatestaticStri nggetCatali naBase()104.returnSystem.getProperty("catalin a.base",getCatali naHome();105.106./*107.* Get thevalue ofthe con figuratio nURL.108.*/109.privatestaticStri nggetC
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 家紡企業(yè)社會(huì)責(zé)任報(bào)告編寫考核試卷
- 面門出租合同范本
- 電影合同范本4篇
- 煤炭居間費(fèi)合同范本
- 小學(xué)生頒獎(jiǎng)視頻模板課件
- 基于大數(shù)據(jù)的智能種植管理平臺(tái)構(gòu)建
- 人才派遣與招聘協(xié)議
- 日常照護(hù)培訓(xùn)課件
- 農(nóng)業(yè)生產(chǎn)安全防范指南
- 互聯(lián)網(wǎng)行業(yè)數(shù)據(jù)安全防護(hù)策略
- (正式版)FZ∕T 80018-2024 服裝 防靜電性能要求及試驗(yàn)方法
- 玻璃體腔注藥及圍注射期管理
- 北師大版八年級(jí)下冊(cè)生物教案全冊(cè)
- 技術(shù)學(xué)院各部門廉政風(fēng)險(xiǎn)點(diǎn)、防控措施匯編
- JGJ133-2001 金屬與石材幕墻工程技術(shù)規(guī)范
- 穩(wěn)定性冠心病診斷與治療指南
- DL-T5704-2014火力發(fā)電廠熱力設(shè)備及管道保溫防腐施工質(zhì)量驗(yàn)收規(guī)程
- (高清版)JGT 225-2020 預(yù)應(yīng)力混凝土用金屬波紋管
- JT-T-610-2004公路隧道火災(zāi)報(bào)警系統(tǒng)技術(shù)條件
- 初中英語(yǔ)比較級(jí)和最高級(jí)專項(xiàng)練習(xí)題含答案
- 鑒賞詩(shī)歌人物形象市公開課一等獎(jiǎng)省賽課微課金獎(jiǎng)?wù)n件
評(píng)論
0/150
提交評(píng)論