Websphere的类加载器以及策略的简单介绍
轉載自: https://blog.csdn.net/eric_sunah/article/details/17289985
1.1???? 什么是ClassLoader
顧名思義,類加載器(class loader)用來加載 Java 類到 Java 虛擬機中。一般來說,Java 虛擬機使用 Java 類的方式如下:Java 源程序(.java 文件)在經過 Java 編譯器編譯之后就被轉換成 Java 字節代碼(.class 文件)。類加載器負責讀取 Java 字節代碼,并轉換成 java.lang.Class類的一個實例。每個這樣的實例用來表示一?? 個Java 類。通過此實例的 newInstance()方法就可以創建出該類的一個對象。實際的情況可能更加復雜,比如 Java 字節代碼可能是通過工具動態生成的,也可能是通過網絡下載的。
基本上所有的類加載器都是 java.lang.ClassLoader類的一個實例。下面詳細介紹這個 Java 類。
1.2???? ClassLoader? 的職責
java.lang.ClassLoader類的基本職責就是根據一個指定的類的名稱,找到或者生成其對應的字節代碼,然后從這些字節代碼中定義出一個 Java 類,即 java.lang.Class類的一個實例。除此之外,ClassLoader還負責加載 Java 應用所需的資源,如圖像文件和配置文件等。不過本文只討論其加載類的功能。
?
1.3???? 什么是ClassLoader Delegation
細節請參見:http://blog.csdn.net/eric_sunah/article/details/7969077
關于類加載器的層次結構,以下的幾點說明可能更有助于進一步的理解類的查找和加載過程:
- 每個類加載器負責在自身定義的類路徑上進行查找和加載類。
- 一個子類加載器能夠委托它的父類加載器查找和加載類,一個加載類的請求會從子類加載器發送到父類加載器,但是從來不會從父類加載器發送到子類加載器。
- 一旦一個類被成功加載, JVM 會緩存這個類直至其生命周期結束,并把它和相應的類加載器關聯在一起,這意味著不同的類加載器可以加載相同名字的類。
- 如果一個加載的類依賴于另一個或一些類,那么這些被依賴的類必須存在于這個類的類加載器查找路徑上,或者父類加載器查找路徑上。
如果一個類加載器以及它所有的父類加載器都無法找到所需的類,系統就會拋出 ClassNotFoundExecption 異常或者 NoClassDefFoundError 的錯誤
1.4???? WAS的Class Loader
WebSphere 中類加載器的層次結構圖1 所示:
如上圖所示,WebSphere 中類加載器被組織成一個自上而下的層次結構,最上層是系統的運行環境JVM ,最下層是具體的應用程序,上下層之間形成父子關系。
- JVM Class loader :位于整個層次結構的最上層,它是整個類加載器層次結構的根,因此它沒有父類加載器。這個類加載器負責加載 JVM 類, JVM 擴展類,以及定義在 classpath 環境變量上的所有的 Java 類。
- WebSphere Extensions Class loader : WebSphere 擴展類加載器 , 它將加載 WebSphere 的一些 runtime 類,資源適配器類等。
- WebSphere lib/app Class loader : WebSphere 服務器類加載器,它將加載 WebSphere 安裝目錄下 $(WAS_HOME)/lib/app 路徑上的類。 在 WAS v4 版本中, WAS 使用這個路徑在所有的應用程序之間共享 jar 包。從 WAS v5 開始, 共享庫功能提供了一種更好的方式,因此,這個類加載器主要用于一些原有的系統的兼容。
- WebSphere "server" Class loader : WebSphere 應用服務器類加載器。 它定義在這個服務器上的所有的應用程序之間共享的類。 WAS v5 中有了共享庫的概念之后,可以為應用服務器定義多個與共享庫相關聯的類加載器,他們按照定義的先后順序形成父子關系。
- Application Module Class Loader :應用程序類加載器,位于層次結構的最后一層,用于加載 J2EE 應用程序。根據應用程序的類加載策略的不同,還可以為 Web 模塊定義自己的類加載器。
1.5???? WebSphere 中的類加載器策略
WebSphere 中對類加載器有一些相關的配置,稱為類加載器策略(class loader policy )。類加載器策略指類加載器的獨立策略(classloader isolation policy ), 通過類加載器策略設置,我們可以為WAS 和應用程序的類加載器進行獨立定義。
每個WAS 可以配置自己的應用程序類加載器策略,WAS 中的每個應用程序也可以配置自己的Web 模塊類加載器策略,下面我們對這兩種策略分別介紹。
(官方配置手冊:http://publib.boulder.ibm.com/infocenter/iseries/v5r4/index.jsp?topic=%2Frzatz%2F51%2Fprogram%2Fclsadmcns.htm)
1.5.1???應用服務器(WAS )配置:應用程序類加載器策略
應用服務器對應用程序類加載器策略有兩種配置:
- Single :整個應用服務器上的所有應用程序(Jar,RAR,EJBJAR)使用同一個類加載器(Application classloader)。在這種配置下,每個應用程序不再有自己的類加載器,每個Application中jar文件可以互相訪問。
部署模型如下:
?
- Multiple(DEFAULT) :應用服務器上的每個應用程序使用自己的類加載器。
部署模型如下:
?
- WAR如何被加載,由WAR單獨的側率來決定
1.5.2??? 應用程序配置:Web 模塊類加載器策略
應用程序中對Web模塊類加載器有兩種配置:
- Application :整個應用程序內的所有的實用程序 jar 包和 Web 模塊使用同一個類加載器。
- Module(DEFAULT) :應用程序內的每個 Web 模塊使用自己的類加載器。應用程序的類加載器仍然存在,負責加載應用程序中 Web 模塊以外的其它類,包括所有的實用程序 jar 包。
?
1.5.3?ClassLoader模式的設置
該設置針對Application/WAR加載器都有效
- Parent_First :在加載類的時候,在從類加載器自身的類路徑上查找加載類之前,首先嘗試在父類加載器的類路徑上查找和加載類。
- Parent_Last :在加載類的時候,首先嘗試從自己的類路徑上查找加載類,在找不到的情況下,再嘗試父類加載器類路徑。
1.6???? 綜合配置的小例子
?
總結
以上是生活随笔為你收集整理的Websphere的类加载器以及策略的简单介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查看was中项目类的加载顺序
- 下一篇: Spring Boot CMI 使用笔记