成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Tomcat 7 類加載器是如何實現(xiàn)的

trigkit4 / 729人閱讀

摘要:請注意,應(yīng)用程序類加載器的模型與此略有不同,如下所述,但主要原則是相同的。此類由加載器搜索的位置中的屬性定義。該服務(wù)器類加載器是唯一到內(nèi)部可見,并且是應(yīng)用程序完全不可見。

Tomcat 7 類加載器是如何實現(xiàn)的 概述

與許多服務(wù)器應(yīng)用程序一樣,Tomcat安裝了各種類加載器(即實現(xiàn)的類java.lang.ClassLoader),以允許容器的不同部分和容器上運行的Web應(yīng)用程序訪問可用類和資源的不同存儲庫。此機制用于提供Servlet規(guī)范2.4版中定義的功能 - 特別是9.4和9.6節(jié)。

在Java環(huán)境中,類加載器排列在父子樹中。通常,當(dāng)要求類加載器加載特定的類或資源時,它首先將請求委托給父類加載器,然后僅在父類加載器找不到所請求的類或資源時查找它自己的存儲庫。 。請注意,Web應(yīng)用程序類加載器的模型與此略有不同,如下所述,但主要原則是相同的。

當(dāng)Tomcat啟動時,它會創(chuàng)建一組類加載器,這些加載器被組織成以下父子關(guān)系,其中父類加載器位于子類加載器之上:

          Bootstrap
              |
           System
              |
           Common
           /     
      Webapp1   Webapp2 ...

這些類加載器的特征,包括它們可見的類和資源的來源,將在下一節(jié)中詳細(xì)討論。

類加載器定義

如上圖所示,Tomcat在初始化時創(chuàng)建以下類加載器:

Bootstrap - 此類加載器包含Java虛擬機提供的基本運行時類,以及System Extensions目錄($JAVA_HOME/jre/lib/ext)中存在的JAR文件中的任何類。 注意:一些JVM可能將其實現(xiàn)為多個類加載器,或者它可能根本不可見(作為類加載器)。

System - 此類加載器通常從CLASSPATH環(huán)境變量的內(nèi)容初始化。Tomcat內(nèi)部類和Web應(yīng)用程序都可以看到所有這些類。但是,標(biāo)準(zhǔn)的Tomcat啟動腳本($CATALINA_HOME/bin/catalina.sh或 %CATALINA_HOME%bincatalina.bat)完全忽略CLASSPATH環(huán)境變量本身的內(nèi)容,而是從以下存儲庫構(gòu)建System類加載器:

$CATALINA_HOME/bin/bootstrap.jar - 包含用于初始化 Tomcat 服務(wù)器的main() 方法,以及它依賴的類加載器實現(xiàn)類。

$CATALINA_BASE/bin/tomcat-juli.jar 或 $CATALINA_HOME/bin/tomcat-juli.jar - 記錄實現(xiàn)類。其中包括java.util.loggingAPI 的增強類 ,稱為Tomcat JULI,以及Tomcat內(nèi)部使用的Apache Commons Logging庫的軟件包重命名副本。有關(guān)詳細(xì)信息,請參閱日志記錄

如果tomcat-juli.jar是出現(xiàn)在 $CATALINA_BASE/bin 中,它被用來代替 $CATALINA_HOME/bin 中的那一個。它在某些日志記錄配置中很有用

$CATALINA_HOME/bin/commons-daemon.jar - 來自Apache Commons Daemon項目的類。這個JAR文件不存在于CLASSPATH 由腳本catalina.bat|.sh 構(gòu)建,但是從bootstrap.jar的清單文件中引用。

Common - 此類加載器包含對Tomcat內(nèi)部類和所有Web應(yīng)用程序都可見的其他類。

通常情況下,應(yīng)用類應(yīng)該不 放在這里。此類由common.loader加載器搜索的位置$CATALINA_BASE/conf/catalina.properties 中的屬性定義。默認(rèn)設(shè)置將按列出的順序搜索以下位置:

解壓縮的類和資源 $CATALINA_BASE/lib

JAR文件 $CATALINA_BASE/lib

解壓縮的類和資源 $CATALINA_HOME/lib

JAR文件 $CATALINA_HOME/lib

默認(rèn)情況下,這包括以下內(nèi)容:

annotations-api.jar - JavaEE注釋類。
catalina.jar - Tomcat的Catalina servlet容器部分的實現(xiàn)。
catalina-ant.jar - Tomcat Catalina Ant任務(wù)。
catalina-ha.jar - 高可用性包。
catalina-tribes.jar - 群組通信包。
ecj - * .jar - Eclipse JDT Java編譯器。
el-api.jar - EL 2.2 API。
jasper.jar - Tomcat Jasper JSP編譯器和運行時。
jasper-el.jar - Tomcat Jasper EL實現(xiàn)。
jsp-api.jar - JSP 2.2 API。
servlet-api.jar - Servlet 3.0 API。
tomcat-api.jar - Tomcat定義的幾個接口。
tomcat-coyote.jar - Tomcat連接器和實用程序類。
tomcat-dbcp.jar - 基于包重命名的Apache Commons Pool和Apache Commons DBCP 1.x的數(shù)據(jù)庫連接池實現(xiàn)。
tomcat-i18n - **。jar - 包含其他語言資源包的可選JAR。由于默認(rèn)捆綁包也包含在每個多帶帶的JAR中,因此如果不需要消息的國際化,則可以安全地刪除它們。
tomcat-jdbc.jar - 另一種數(shù)據(jù)庫連接池實現(xiàn),稱為Tomcat JDBC池。有關(guān)詳細(xì)信息,請參閱 文檔
tomcat-util.jar - Apache Tomcat的各種組件使用的公共類。
tomcat7-websocket.jar - WebSocket 1.1實現(xiàn)
websocket-api.jar - WebSocket 1.1 API
WebappX - 為部署在單個Tomcat實例中的每個Web應(yīng)用程序創(chuàng)建一個類加載器。/WEB-INF/classesWeb應(yīng)用程序目錄中的所有解壓縮的類和資源,以及Web應(yīng)用程序/WEB-INF/lib目錄下的JAR文件中的類和資源,都對此Web應(yīng)用程序可見,但對其他應(yīng)用程序不可見。

如上所述,Web應(yīng)用程序類加載器與默認(rèn)Java委托模型不同(根據(jù)Servlet規(guī)范2.4版,第9.7.2節(jié)Web應(yīng)用程序類加載器中的建議)。當(dāng)加載從Web應(yīng)用程序的一個類的請求WebappX被處理的類加載器,這個類加載器會在本地資源庫第一而不是在尋找之前委托。也有例外。作為JRE基類的一部分的類不能被覆蓋。對于某些類(例如J2SE 1.4+中的XML解析器組件),Java認(rèn)可的功能可以用于Java 8.最后,類加載器將明確忽略包含Servlet API類的任何JAR文件 - 不包括此類Web應(yīng)用程序中的JAR。Tomcat中的所有其他類加載器都遵循通常的委托模式。

因此,從Web應(yīng)用程序的角度來看,類或資源加載按以下順序查找以下存儲庫:

JVM的Bootstrap類

/WEB-INF/classes 您的Web應(yīng)用程序的類

/WEB-INF/lib/*.jar 您的Web應(yīng)用程序Jar 包

System 類加載器類(如上所述)

Common 類加載器類(如上所述)

如果配置了Web應(yīng)用程序類加載器 , 則清單順序變?yōu)椋?/p>

JVM的Bootstrap類

System 類加載器類(如上所述)

Common 的類加載器類(如上所述)

/WEB-INF/classes 您的Web應(yīng)用程序的類

/WEB-INF/lib/*.jar 您的Web應(yīng)用程序的Jar 包

XML分析器和Java

從Java 1.4開始,JRE中包含一個JAXP API和一個XML解析器。這會對希望使用自己的XML解析器的應(yīng)用程序產(chǎn)生影響。

在舊版本的Tomcat中,您只需替換Tomcat庫目錄中的XML解析器即可更改所有Web應(yīng)用程序使用的解析器。但是,當(dāng)您運行現(xiàn)代版本的 Java 時,此技術(shù)將無效,因為通常的類加載器委派過程將始終在JDK中選擇優(yōu)先于此實現(xiàn)的實現(xiàn)。

Java支持一種稱為“支持標(biāo)準(zhǔn)覆蓋機制”的機制,以允許替換在JCP外部創(chuàng)建的API(即來自W3C的DOM和SAX)。它還可用于更新XML解析器實現(xiàn)。有關(guān)更多信息,請參閱: http: //docs.oracle.com/javase/1.5.0/docs/guide/standards/index.html。

Tomcat通過-Djava.endorsed.dirs=$JAVA_ENDORSED_DIRS 在啟動容器的命令行中包含系統(tǒng)屬性設(shè)置來利用此機制 。此選項的默認(rèn)值為 $CATALINA_HOME/endorsed。默認(rèn)情況下不會創(chuàng)建此已簽名的目錄。請注意,Java 9不再支持已認(rèn)可的功能,并且只有在目錄$CATALINA_HOME/endorsed 存在或 JAVA_ENDORSED_DIRS 已設(shè)置變量 時才會設(shè)置上述系統(tǒng)屬性。

請注意,覆蓋任何JRE組件都存在風(fēng)險。如果覆蓋組件未提供100%兼容的API(例如,Xerces提供的API與JRE提供的XML API不完全兼容),則存在Tomcat和/或部署的應(yīng)用程序?qū)⒊霈F(xiàn)錯誤的風(fēng)險。

在安全管理器下運行

在安全管理器下運行時,允許加載類的位置也取決于策略文件的內(nèi)容。有關(guān)詳細(xì)信息,請參閱安全管理器HOW-TO。

高級配置

還可以配置更復(fù)雜的類加載器層次結(jié)構(gòu)。見下圖。默認(rèn)情況下, 未定義 Server 和 Shared 類加載器,并使用上面顯示的簡化層次結(jié)構(gòu)。可以通過定義 server.loader 和/或 shared.loader 屬性的值來使用這種更復(fù)雜的層次結(jié)構(gòu) conf/catalina.properties 。

      Bootstrap
          |
        System
          |
        Common
         /  
    Server  Shared
             /  
       Webapp1  Webapp2 ...

該服務(wù)器類加載器是唯一到Tomcat內(nèi)部可見,并且是Web應(yīng)用程序完全不可見。

所述 Common 類加載器是將所有的web應(yīng)用程序可見,并且可以在所有的 web 應(yīng)用程序被用來共享代碼。但是,對此共享代碼的任何更新都需要重新啟動Tomcat。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/77738.html

相關(guān)文章

  • java加載相關(guān)

    摘要:標(biāo)準(zhǔn)擴展類加載器,它負(fù)責(zé)加載或由系統(tǒng)變量指定位置中的類庫加載到內(nèi)存中。系統(tǒng)類加載器,它負(fù)責(zé)將類路徑中的類庫加載到內(nèi)存。 類加載機制大家應(yīng)該已經(jīng)非常熟悉了,采取雙親委派機制,當(dāng)加載一個類時,首先將加載任務(wù)委托給父類加載器,依次遞歸,如果父類加載器可以完成加載任務(wù),就成功返回;如果父類無法加載,才由自己加載。 雙親委派機制的作用:防止內(nèi)存中出現(xiàn)多份相同的字節(jié)碼。 其他規(guī)則:1.隱式加載:...

    el09xccxy 評論0 收藏0
  • Java基礎(chǔ)-加載器以及加載機制

    摘要:以上文中的類的加載過程為例,它的加載器為系統(tǒng)類加載器。自定義加載器編寫自定義加載器并不困難,只要繼承抽象類并覆蓋方法就行了。源碼來自參考資料類加載機制與類加載器架構(gòu)深入探討類加載器 序 我是在關(guān)于Java的面試題里了解到類加載器的,在這之前從未想過Java里類是如何被加載、解析的,一直以為只要Import就好了。事實上Java類加載器是一塊非常重要的內(nèi)容,可以用在類層次劃分、OSGi、...

    stefan 評論0 收藏0
  • TOMCAT源碼閱讀總結(jié)(1)-TOMCAT加載體系

    摘要:加載器之間父子關(guān)系不是通過類繼承的方式,而是通過對象變量的方式,來實現(xiàn)的。調(diào)用的方法,將設(shè)置為所有的獲取各個類加載器相應(yīng)的資源配置文件這些是具體配置在配置文件中的。 摘要 一直以來想看一下tomcat的源碼,可以從頭到尾理解一遍在整個web請求的處理過程中,容器完成的功能,容器怎么把一個url的請求的處理遞交給了servlet,容器的pipeline是怎么設(shè)計的,容器的filter怎么...

    ChanceWong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<