在我的專案中,Apache Tomcat 8.5 context.xml配置如下。
<Context path="/helloWorld" docBase="C:\projects\helloWorld\app" crossContext="false" debug="0" reloadable="false"/>
C:\projects\helloWorld\app 有一個 web-inf\lib 檔案夾,其中包含一個servlet.jar以及應用程式所需的其余 jar。
此應用程式部署到 Tomcat 8.5 Web 服務器,%TOMCAT_HOME%\lib 檔案夾還包含一個servlet-api.jar。
該應用程式按預期作業。
我檢查了兩個 jar,servlet.jar 包含常規 servlet api 類,而 tomcat 的 servlet-api.jar 包含這些常規 servlet api 類以及許多其他與 servlet 功能相關的類。
查詢: 既然有兩個用于運行 servlet 的 jar,即 servlet.jar 和 servlet-api.jar,那么 Tomcat 在運行 servlet 時如何知道要選擇哪個 jar?
uj5u.com熱心網友回復:
域名注冊地址:
Tomcat 將加載它自己版本的 servlet API,因為這是 JavaEE 規范所要求的。
長答案
JavaEE 定義了類的加載和決議方式。
通常類加載器是父級優先的——即嘗試從父類加載器加載類,只有當失敗時,它們才會嘗試自己加載類。
但是網路應用程式有一個自我優先的類加載器,它從自身加載類,只有當它失敗時,它們才會嘗試從父類加載。但也有一些例外:
- 那些自我優先的類加載器不能覆寫 JRE 類
- 并且他們總是對 JavaEE 類進行“父級優先”加載
您可以閱讀有關Apache Tomcat 檔案的更多詳細資訊
只要 servlet api 版本匹配,就不會有任何問題。但是,如果您的 servlet 是針對不同的 api 版本編譯的,例如它們是使用 Servlet v4 編譯的,但是您嘗試在 Servlet v3 環境中使用它們,則會出現運行時錯誤
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/316731.html
