tomcat jar包_tomcat学习|tomcat中的类加载器
開頭說兩句
小刀博客:?http://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中各個類加載器初始化,聲明的地方
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應用的父加載器
使用位置如下
在源碼中聲明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中
StandardContext.startInternal 方法中
if (getLoader() == null) { WebappLoader webappLoader = new WebappLoader(getParentClassLoader()); webappLoader.setDelegate(getDelegate()); setLoader(webappLoader); }其作用是,每個獨立的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中的类加载器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现雪花飘落效果_jQuer
- 下一篇: python桌面开发吐血_Python3