簡體   English   中英

Tomcat 如何知道選擇哪個 jar 來運行 servlet?

[英]How does Tomcat know which jar to choose for running a servlet?

在我的項目中, 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以及應用程序需要的 jars 的 rest。

此應用程序部署到 Tomcat 8.5 web 服務器,%TOMCAT_HOME%\lib 文件夾還包含一個servlet-api.jar

該應用程序按預期工作。

我檢查了兩個 jars 和 servlet.jar 包含常規 servlet api 類,而 tomcat 的 servlet-api.jar 包含這些常規 servlet api 類以及許多其他 servlet 功能相關類。

查詢:因為有兩個 jars 用於運行 servlet,即 servlet.jar 和 servlet-api.jar,Tomcat 如何知道在運行 servlet 時選擇哪個 jar?

TLDR:

Tomcat 將加載自己版本的 servlet API,因為這是 JavaEE 規范所要求的。

長答案

JavaEE 定義了如何加載和解析類。

通常類加載器是父級優先的——即嘗試從父類加載器加載類,只有在失敗時,它們才會嘗試自己加載 class。

但是 web 應用程序有一個自優先類加載器,它從自身加載類,只有當它失敗時,它們才會嘗試從父類加載。 但也有一些例外:

  • 那些自我優先的類加載器不能覆蓋 JRE 類
  • 並且他們總是“父優先”加載 JavaEE 類

您可以在Apache Tomcat 的文檔中閱讀更多詳細信息

只要 servlet api 版本匹配就不會有任何問題。 但是,如果您的 servlets 是針對不同的 api 版本編譯的,例如它們是使用 Servlet v4 編譯的,但您嘗試在 Servlet v3 環境中使用它們,則會出現運行時錯誤

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM