tomcat的class加載的優先順序

來源:https://bbs.csdn.net/topics/80459833

Tomcat的class加載的優先順序一覽

  1. 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
  2. 環境變量CLASSPATH中的jar和class文件。
  3. \$CATALINA_HOME/common/classes下的class文件。
  4. \$CATALINA_HOME/commons/endorsed下的jar文件。
  5. \$CATALINA_HOME/commons/i18n下的jar文件。
  6. \$CATALINA_HOME/common/lib 下的jar文件。(JDBC驅動之類的jar文件可以放在這里,這樣就可以避免在server.xml配置好數據源卻出現找不到JDBC Driver的情況。)
  7. \$CATALINA_HOME/server/classes下的class文件。
  8. \$CATALINA_HOME/server/lib/下的jar文件。
  9. \$CATALINA_BASE/shared/classes 下的class文件。
  10. \$CATALINA_BASE/shared/lib下的jar文件。
  11. 各自具體的webapp /WEB-INF/classes下的class文件。
  12. 各自具體的webapp /WEB-INF/lib下的jar文件。

?

class的搜尋順序如下:

-------------
Bootstrap classes of your JVM
System class loader classses (described above)
/WEB-INF/classes of your web application
/WEB-INF/lib/*.jar of your web application

(這里可以看出class是先去WEB-INF下面找的)

\${CATALINA_HOME}/common/classes
\${CATALINA_HOME}/common/endorsed/*.jar
\${CATALINA_HOME}/common/i18n/*.jar
\${CATALINA_HOME}/common/lib/*.jar
\${CATALINA_BASE}/shared/classes
\${CATALINA_BASE}/shared/lib/*.jar
--------------

因此放在不同webapp里的class文件,會被classloader加載成不同的實例。
例如假設下面兩個不同內容的class。分別放在不同的webapp的class目錄下。

package com.lizongbo;
public class TestClass {
?? private String NAME="lizongbo";
}

package com.lizongbo;
public class TestClass {
?? private String NAME="li_zongbo";
}

在不同的webapp得到的com.lizongbo.NAME結果是不同的,且互不影響。

但是注意,以下包名開頭的class例外:
javax.*
org.xml.sax.*
org.w3c.dom.*
org.apache.xerces.*
org.apache.xalan.*

ps,注意.在各個jar中的\META-INF\MAINFEST.MF文件里Class-Path鍵值對,也會提供jar的加載優先順序。
例如某jar的MAINFEST.MF內容如下:
Manifest-Version: 1.0
Created-By: lizongbo
Class-Path: commons-beanutils.jar
Class-Path: commons-collections.jar
Class-Path: commons-dbcp.jar
Class-Path: commons-digester.jar
Class-Path: commons-logging.jar
Class-Path: commons-pool.jar
Class-Path: commons-services.jar
Class-Path: commons-validator.jar
Class-Path: jakarta-oro.jar
Main-Class: com.lizongbo.MyTestClass


那么在加載這個jar的時候,會先在此jar所在目錄下依次先加載commons-beanutils.jar,commons-collections.jar......等jar文件。

在不同的地方放置jar和class可能會產生意想不到的后果,尤其是不同版本的jar文件,因此在實際應用部署web應用時候要特別留心.


例如 使用javamail常見的一個出錯信息:
javax.mail.NoSuchProviderException: No provider for smtp
其真實原因就很可能如下:
在不同的加載jar的目錄下放置了不同版本的mail.jar,比如一個是javamail1.3.1的mail.jar
在D:\jakarta-tomcat-5.5.8\common\lib下,而另外一個是javamail1.3.2的mail.jar在
D:\jakarta-tomcat-5.5.8\webapps\lizongbo\WEB-INF/lib下,
那么lizongbo這個webapp中使用到javamail進行郵件發送的時候,便會出現No provider for smtp的錯誤。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/451446.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/451446.shtml
英文地址,請注明出處:http://en.pswp.cn/news/451446.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡單理解Hadoop(Hadoop是什么、如何工作)

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 一、Hadoop主要的任務部署分為3個部分,分別是:Client機器,主節點和從節點。主節點主要負責Hadoop兩個…

JPA @Id 和 @GeneratedValue 注解詳解

Id: Id 標注用于聲明一個實體類的屬性映射為數據庫的主鍵列。該屬性通常置于屬性聲明語句之前,可與聲明語句同行,也可寫在單獨行上。 Id標注也可置于屬性的getter方法之前。 GeneratedValue: GeneratedValue 用于標注主鍵的生…

Factorials 階乘

Description N的階乘寫作N!表示小于等于N的所有正整數的乘積。階乘會很快的變大,如13!就必須用32位整數類型來存儲,70!即使用浮點數也存不下了。你的任務是找到階乘最后面的非零位。舉個例子,5!1*2*3*4*5120所以5!的最后面的非零位是2&#x…

硬件模塊設計思想

硬件模塊設計">模塊設計,顧名思義就是將各個不同的功能做成獨立的模塊。然后將各個模塊組合成不同的產品。 對于一個公司硬件模塊化設計,從設計之初,調試,到樣機及產品生產的過程應該是這樣: 1.     了解產品需求 2.     根據需求,選擇合適的處理…

java中的lastIndexOf( )函數是什么意思

int x a.lastIndexOf(b),表示b字符串在a字符串中最后出現的位置。如 a "abcdabcd";b"d";那么x的值為7.

2 分鐘讀懂大數據框架 Hadoop 和 Spark 的異同

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 談到大數據,相信大家對Hadoop和Apache Spark這兩個名字并不陌生。但我們往往對它們的理解只是提留在字面上,并沒有…

操作系統文件編程知識

文件的創建和讀寫 當我們需要打開一個文件進行讀寫操作的時候&#xff0c;我們可以使用系統調用函數open。使用完成以后我們調用另外一個close函數進行關閉操作。 該函數使用的頭文件如下&#xff1a; #include <fcntl.h> #include <unistd.h> #include <sys/ty…

論述HTML5平臺的若干重要特性

開發者已憑借網頁技術制作出創收豐厚的游戲作品許多年&#xff1a;《部落戰爭》憑借靜態網頁頁面大獲成功&#xff0c;《Farmville》憑借Flash開拓出新的疆域。但如今越來越多人覺得&#xff0c;未來HTML5將變成游戲的主要平臺。為什么HTML5如此頗具趣味&#xff0c;它是否真的…

多GPU使用詳解

目錄&#xff1a; 介紹 記錄設備狀態 手動分配狀態 允許GPU內存增長 在多GPU系統是使用單個GPU 使用多個 GPU 一、介紹 在一個典型的系統中&#xff0c;有多個計算設備。在 TensorFlow 中支持的設備類型包括 CPU 和 GPU。他們用字符串來表達&#xff0c;例如&#xff1a; “/cp…

圖片上傳的兩種方式

總的說圖片上傳有兩種方式&#xff0c;一種是把圖片文件寫到數據庫中&#xff0c;另一種是存到服務器文件目錄中。寫到數據庫中的圖片文件需要轉換成二進制流的格式&#xff0c;占用數據庫空間比較多&#xff0c;適合少量圖片的存儲&#xff0c;比如說&#xff0c;系統中某些小…

最好理解的: spring ioc原理講解,強烈推薦!

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 IOC&#xff08;DI&#xff09;&#xff1a;java程序中的每個業務邏輯至少需要兩個或以上的對象來協作完成。通常&#xff0c;每個對象在…

微信小程序 - 回到自己位置(map)

演示效果&#xff1a; 圖片資源 index.js 1 /** 2 * 回到自己位置&#xff0c;在cover-image上綁定點擊事件即可. 3 */ 4 clickcontrol(e) { 5 let mpCtx wx.createMapContext("map"); 6 mpCtx.moveToLocation(); 7 }, 轉載于:https://www.cnbl…

uwsgi搭配nginx

uwsgi搭配nginx可以做域名解析和負載均衡uWSGI&#xff0c;既不用wsgi協議也不用fcgi協議&#xff0c;而是自創了一個uwsgi的協議&#xff0c;據說該協議大約是fcgi協議的10倍那么快。uWSGI的主要特點如下&#xff1a;◆超快的性能。◆低內存占用&#xff08;實測為apache2的mo…

如何讓tomcat服務器運行在80端口,并且無需輸入項目名即可訪問項目()

這個問題最開始遇到的時候是半年前,自己買了個服務器玩,但是域名解析的時候出了問題,我查了查資料才知道騰訊云是默認解析到80端口,而且還改不了. 首先是修改tomcat運行端口號,默認是8080,但是我們可以通過修改配置文件更改, 打開conf/server.xml文件找到這個地方,: 將8080改為…

tailf、tail -f、tail -F三者區別

tail -f 等同于--followdescriptor&#xff0c;根據文件描述符進行追蹤&#xff0c;當文件改名或被刪除&#xff0c;追蹤停止 tail -F 等同于--followname --retry&#xff0c;根據文件名進行追蹤&#xff0c;并保持重試&#xff0c;即該文件被刪除或改名后&#xff…

使用圖形芯片加速電子自動化設計應用程序

以往EDA應用性能瓶頸主要受兩方面因素制約&#xff0c;首先大多數應用都是單線程的&#xff0c;而CPU和GPU架構擁有幾十到數千的并行內核&#xff0c;其次是應用程序內存延遲問題。目前EDA應用已經部署到傳統的常規處理器上。最重要的是這些應用促使人們設計出并行或向量處理器…

自我介紹的四個套路

四套路內容&#xff1a; 1、我是誰&#xff0c;叫什么名字&#xff0c;我從哪里來。 2、我因為什么機緣出現這個場合。 3、我能給大家帶來什么價值。 4、我希望能夠得到大家的什么幫助。 示例&#xff1a; 大家好&#xff0c;我叫XXX&#xff0c; 聽說今天會有幾個高人在場&…

加載樣式js

var MaskUtil (function(){ var $mask,$maskMsg; var defMsg 數據導出中&#xff0c;請稍待。。。; function init(){ if(!$mask){ $mask $("<div class\"datagrid-mask mymask\"></div>").appendTo("body"); } if(!$mask…

flush privileges

flush privileges 命令本質上的作用是將當前user和privilige表中的用戶信息/權限設置從mysql庫(MySQL數據庫的內置庫)中提取到內存里。MySQL用戶數據和權限有修改后&#xff0c;希望在"不重啟MySQL服務"的情況下直接生效&#xff0c;那么就需要執行這個命令。通常是在…

【Linux】Linux中常用操作命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 常用指令 ls   顯示文件或目錄 -l 列出文件詳細信息l(list) -a 列出當前目錄下所有文件及目錄&#xff0…