我有一個 Tomcat,它在 tomcat/lib 中包含一些 logback*.jar jar,當我的 WEB-INF/lib 包含相同的 logback*.jar jar 時它啟動正常,但是當我洗掉 logback*.jar 時WEB-INF/lib,然后啟動會提到LoggerFactory class not found。所以我將 slf4j-api*.jar 復制到 tomcat/lib 中,它再次啟動正常。
我很好奇普通加載器不能參考 WEB-INF/lib 中的 jars 嗎?
它必須將 logback*.jar 和依賴 jar slf4j-api*.jar 放在同一個地方嗎?
為什么當 WEB-INF/lib 包含這些 jars 時可以正常作業?看起來 WEB-INF/lib 中的 jars 可以替換 tomcat/lib,而 reverse 不能。我對嗎?
參考:https ://tomcat.apache.org/tomcat-8.0-doc/class-loader-howto.html
uj5u.com熱心網友回復:
你有一個公共的類加載器,它對服務器和所有的 web 應用程式都可用,你有一個 web 應用程式的類加載器,它只對每個單獨的 web 應用程式可用。webapp 類加載器也可以訪問通用(原文如此!)類加載器,但反之亦然 - 所以你是對的。
為什么這一切?
一些資源是由服務器提供的,因此它們需要對服務器可用(不僅僅是對 Web 應用程式)。想想通過 JNDI 提供的資料庫驅動程式,通常由服務器啟動。日志記錄工具——尤其是當它們通過服務器配置時——是另一個很好的選擇,就像你的情況一樣。
重要的是不要在類路徑上復制任何類——例如,如果你在公共類加載器(tomcat/lib)中有一個 jar,不要將它添加到 webapp 的類路徑中。否則,您可能會以看似無法解釋的 ClassCastException 告終,其中無法將物件型別轉換為自己的型別或合法的超型別(但來自不同的類加載器)
因此,如果您需要服務器類路徑上的一些資源(并傳遞到您的 web 應用程式中),您必須將它們部署在公共類路徑 tomcat/lib 中。如果您只需要在 webapp 中使用它們:盡可能將它們保留在本地(這將允許同一服務器上的其他 webapps 帶來他們自己的版本——實際上是相同的庫,但版本不同——沒有任何沖突)。在過去,通用類加載器被用來節省一些記憶體(通過不本地化每個 webapp 使用的資源),但考慮到 RAM 的價格與 jar 檔案的典型大小,我不會再走這條路了。
當您鏈接 Tomcat 8.0 檔案時:確保您使用的 Tomcat 版本仍在更新。在回答這個問題時,至少是 Tomcat 8.5
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/471263.html
標籤:雄猫
下一篇:如何在php中格式化json回應
