tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器
開頭說兩句
小刀博客: https://www.lixiang.red
小刀公眾號: 程序員學習大本營
學習背景
上期我們聊到了tomcat中各個組件在默認值,在其中,我們看到了有關類加載器的代碼, 如context中初始化wabAppLoader https://www.lixiang.red/articles/2019/08/09/1565361802994.html 今天我們一起學習類加載器相關知識
java里面的類加載器
我們在寫java代碼時,源文件是 .java , 然后經過編譯之后,會變成 .class 文件,類加載器加載的,實際上就是*.class文件, 在實際開發中,我們會把相關的 .class 文件,打成一個jar包, 然后直接加載jar包就可以了. 類加載器就是用來加載這些類到虛擬機里,供程序調用
Bootstrap Class Loader
用來加載JVM提供的基礎運行類,即位于%JAVA_HOME%jre/lib 這個目錄下面的核心類庫
Extension Class Loader
java提供的一個標準備的擴展機制,用于加載除核心類庫外的jar包.默認的擴展目錄是 %JAVA_HOME%/jar/lib/ext
該目錄下的類庫,對所有基于該JVM運行的程序都是可見的
System class loader
用于加載環境變量 CLASSPATH 指定目錄下的或者是用 -classpath運行參數指定的jar包.
System Class Loader 通常用于加載應用程序jar包及其啟動入口類(Tomcat Bootstrap類就是由System Class Loader 來加載的)
類加載器的雙親委派模式
上面三種類加載器,實際上是有父子關系,Bootstrap 是 Extension的父加載器, Extension 是System的父加載器 當System ClassLoader 拿到一個class 文件之后, 會先問父加載器(Extension Class Loader)能不能加載,當(Extension )接收到請求時,會先問問他的父加載器(BootStrap類加載器能不能加載). 如果 Bootstrap可以加載,則由Bootstrap來加載,如不能,則由Extension來加載. 如果 Extension 也加載不了的話,最后由System 類加載器來加載.
tomcat中的類加載器
總共有四種類加載器: Common Class Loader, Catalina Class Loader , Shared Class Loader, Web AppClass Loader. tomcat中各個類加載器初始化,聲明的地方
/*** 初始化tomcat中的三大類加載器*/private void initClassLoaders() {try {// CommonLoader 默認繼承AppClassLoadercommonLoader = createClassLoader("common", null);if( commonLoader == null ) {// no config file, default to this loader - we might be in a 'single' env.commonLoader=this.getClass().getClassLoader();}// 以CommonLoader 為父加載器catalinaLoader = createClassLoader("server", commonLoader);// 以CommonLoader 為父加載器sharedLoader = createClassLoader("shared", commonLoader);} catch (Throwable t) {handleThrowable(t);log.error("Class loader creation threw exception", t);System.exit(1);}}Common Class loader
以System Class Loader 為父類加載器, 是位于Tomcat 應用服務器頂層的公用類加載器,默認是加載$CATALINE_HOME/lib 下的jar 包
Catalina Class Loader
以Common Class Loader 為父加載器.用于加載 Tomcat 應用服務器本身的.可以在下圖中看到使用的位置 1.設置當前線程的類加載器為Catalina Class Loader , 在沒設置之前,是由 shell 腳本用 System Class Loader 來加載的 2. 用Catalina Class Loader 加載 Catalina.class 這個文件,并完成一系統組件的初始化
shared Class Loader
以Common 為父加載器,是所有web應用的父加載器 使用位置如下:
/*** Set the shared extensions class loader.** @param parentClassLoader The shared extensions class loader.*/public void setParentClassLoader(ClassLoader parentClassLoader) {this.parentClassLoader = parentClassLoader;}在源碼中聲明parentClassLoader時有一個小坑,他默認是聲明的加載Catalina的類載器即:Catalina Class Loader,但實際上,在實例化后,我們會用反射調用其setParentClassLoader 方法,將parentClassLoader 更改為shared Class Loader
// XXX Should be moved to embedded/*** The shared extensions class loader for this server.*/protected ClassLoader parentClassLoader =Catalina.class.getClassLoader();使用地點:
WebApp Class Loader
初始化的地點有兩處: 1.createStartDigester中
digester.addObjectCreate(prefix + "Context/Loader","org.apache.catalina.loader.WebappLoader","className");其作用是,每個獨立的Context(web應用)都使用獨立的ClassLoader,加載我們web應用中,WEB-INFO/libs 這個目錄下的jar(如我們在應用中引用的spring , mybatis 這些包) 這個做的好處是,不同的web應用包不會沖突,如A應用用的是spring 4.X , B應用用的是spring 5.X , 他們可以在同一個tomcat中運行
最后說兩句
tomcat的類加載機制, 是開始的一個比較復雜的點,需要好好理一理,邊看代碼邊做筆記,這個類加載器什么時候初始化的,做了什么,然后在哪里使用的. 大家在學習過種中,有什么問題,可以和小刀一起交流討論: best396975802
總結
以上是生活随笔為你收集整理的tomcat jar包编译后变成文件夹_tomcat学习|tomcat中的类加载器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全民k歌附近的人怎么打招呼
- 下一篇: python logistics reg