Tomcat服務器啟動錯誤之Offending class: javax/servlet/Servlet.class

??引子???

????最近在基于Wex5項目開發中,遇到使用過程中與Tomcat功能有關的錯誤提示, 如題所示。最終的解決方法就是刪除掉項目上與tomcat沖突的jar包。

org.apache.catalina.loader.WebappClassLoader validateJarFile


??:?validateJarFile(/Users/zxzpc/Downloads/X5/WeX5_V3.4mac/apache-tomcat/webapps/../../runtime/BaasServer/WEB-INF/lib/servlet-api.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class



???? ?順便查找了一些資料,整理如下:

? ? ? Tomcat 啟動后先將tomcat/common/lib目錄下的jar包全部讀入內存,如果webapps目錄里的應用程序中WEB-INF/lib目錄下有相同的包,將無法加載,估計不同版本的包之間也會造成類似問題。因此建議盡量不要把jar包放入tomcat/common/lib目錄下,應該放入WEB- INF/lib目錄下。


????Tomcat類加載順序小結

????Tomcat下的文件目錄?

  1. /bin:存放啟動和關閉tomcat的腳本文件;

  2. ?/conf:存放tomcat的各種配置文件,比如:server.xml?

  3. /server/lib:存放tomcat服務器所需要的各種jar文件(jar文件只可被tomcat 服務器訪問)?

  4. /server/webapps:存放tomcat自帶的兩個web應用:admin應用和manager應用。?

  5. /common/lib:存放tomcat服務器以及所有web應用都可以訪問的jar文件夾(web和tomcat服務器都可訪問此jar)

  6. /shared/lib:存放web都可訪問的jar文件。(可以被所有的web訪問,但不能被tomcat訪問)

  7. ?/logs:存放tomcat的日志文件?

  8. /webapps:當發布web應用時,默認情況下把web應用文件放于此目錄下?

  9. /work:tomcat把由jsp生成的Servlet放于此目錄?

    另:在web應用中,WEB-Inf目錄下,也可以建立lib子目錄,在此子目錄下可以存放各種jar文件,這些jar文件只能被當前web應用訪問。其中,在web-inf目錄下的lib與classes目錄,Tomcat類裝載器先裝載classes目錄下的類,再裝載lib目錄下的類。因為類同名時,classes優先。?

    其中jsp運行時,查找class的順序為:項目文件夾(WEB-INF\lib)—>容器文件夾(tomcat\common\lib)—>jdk文件夾(jdk\jre\lib\ext)?

????默認情況下,Tomcat是一種向上尋找的層次結構,也有向下的,或者是可配置的。?

????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文件可以放在這里,避免配置好數據源卻找不到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的搜尋順序

/WEB-INF/classes of your web application?


/WEB-INF/lib/*.jar of your web application?


$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加載成不同的實例。?在不同的webapp加載相同類名的類互不影響。?

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

值得注意的是:在各個jar中的\META-INF\MAINFEST.MF文件里Class-Path鍵值對,也會提供jar的加載優先順序。?
例如某jar的MAINFEST.MF內容如下:?
Manifest-Version: 1.0?
Created-By: Zianed?
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: Test?

那么在加載這個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\mialtest\WEB-INF/lib下,?那么mialtest中使用到javamail進行郵件發送的時候,便會出現No provider for smtp的錯誤。















本文轉自朱先忠老師51CTO博客,原文鏈接:http://blog.51cto.com/zhuxianzhong/1769307?,如需轉載請自行聯系原作者




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

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

相關文章

面向對象進階(二)----------類的內置方法

一、isinstance(obj,cls)和issubclass(sub,super) 1. isinstance(obj,cls): 檢查是否obj是否是類 cls 的對象 class Player:passp Player()print(isinstance(p, Player))>>> Ture 2. issubclass(sub, super): 檢查sub類是否是 super 類的派生類 class Player:passcla…

BZOJ.3265.志愿者招募加強版(費用流SPFA)

題目鏈接 見上題。 每類志愿者可能是若干段&#xff0c;不滿足那個...全幺模矩陣(全單位模矩陣)的條件&#xff0c;所以線性規劃可能存在非整數解。 于是就可以用費用流水過去順便拿個rank2 233. //20704kb 300ms #include <queue> #include <cstdio> #include &…

谷歌相冊_Google相冊中的新存檔功能是什么?

谷歌相冊If you’re a Google Photos user, you’ve may have seen a new feature called “Archive” show up in the app’s sidebar. if not, don’t stress—it’s just now rolling out and not everyone has it yet. Since it’s new, here’s a quick look at what it i…

CenterOS 7安裝Nginx

1.wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm下載對應當前系統版本的nginx包(package) 2.rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm建立nginx的yum倉庫 3.yum install nginx 下載并安裝nginx systemctl s…

Java的組合排列問題

從4個人中選2個人參加活動&#xff0c;一共有6種選法。 從n個人中選m個人參加活動&#xff0c;一共有多少種選法&#xff1f;C(m/n)C((m-1)/(n-1))C(m/(n-1))數學算法 public class Main {public static void main(String[] args) {System.out.println("請輸入總人數:&quo…

阿里云一鍵建站產品,阿里云自營建站-中小企業建站首選

阿里云推出的自營建站服務&#xff0c;這對于中小企業來說簡直是福利了&#xff0c;現在一般的公司都開始有了自己的官網&#xff0c;有可能就是因為你的官網設計的標準&#xff0c;大氣&#xff0c;客戶就會對你的信任度增加&#xff0c;從而促進一筆不小的訂單&#xff0c;這…

航拍拉近拉遠鏡頭_什么是遠攝鏡頭?

航拍拉近拉遠鏡頭Telephoto lenses can be incredibly useful, but how is it different from other lenses, and when should you use it? 遠攝鏡頭可能非常有用&#xff0c;但是它與其他鏡頭有什么不同&#xff1f;何時使用&#xff1f; 什么是遠攝鏡頭&#xff1f; (What I…

數據庫的簡單了解

數據庫一、什么是數據庫存儲數據的倉庫將數據有組織&#xff0c;按照特定的格式存儲在介質上叫做數據庫二、比較多個數據庫系統a) Oracle 最好的數據庫沒有之一b) SQL server 最好的數據庫(windows)c) MySQL 甲骨文(Oracle) sun 開源三、SQL語言a) SQL(結構化查詢語句) …

阿里云對象存儲OSS支持版本管理特性

2019獨角獸企業重金招聘Python工程師標準>>> 阿里云對象存儲OSS現已經全面支持“對象版本管理”特性。該功能適用于所有的存儲類型以及區域。當Bucket啟用該特性后&#xff0c;“對象版本管理”功能可以保護和恢復誤刪除、誤覆蓋的數據。 對象存儲OSS“版本管理”具…

Python第一天學習---基礎語法

1.字符串的用法(String) Python 中的字符串有兩種索引方式&#xff0c;從左往右以 0 開始&#xff0c;從右往左以 -1 開始。Python中的字符串不能改變。Python 沒有單獨的字符類型&#xff0c;一個字符就是長度為 1 的字符串這三點是我覺得Python字符處理特別的一點 我們來看第…

教你幾招識別和防御Web網頁木馬

本文同時發表在&#xff1a;[url]http://netsecurity.51cto.com/art/200709/56360.htm[/url] 根據反病毒廠商Sophos今年的第一、第二季度報告&#xff0c;網頁已經超過電子郵件成為惡意軟件傳播時最喜歡使用的途徑&#xff0c;通過網頁傳播的惡意軟件平均每月增加300多種。而對…

apple tv設置_如何設置Apple TV播放個人iTunes庫

apple tv設置If you already have a lot of music and home videos in your iTunes library, you can easily stream it all to your Apple TV, and thus whatever output sources to which it is connected. 如果iTunes庫中已經有很多音樂和家庭視頻&#xff0c;則可以輕松地將…

[bzoj1050 HAOI2006] 旅行comf (kruskal)

傳送門 Description 給你一個無向圖&#xff0c;N(N<500)個頂點, M(M<5000)條邊&#xff0c;每條邊有一個權值Vi(Vi<30000)。給你兩個頂點S和T&#xff0c;求 一條路徑&#xff0c;使得路徑上最大邊和最小邊的比值最小。如果S和T之間沒有路徑&#xff0c;輸出”IMPOSS…

好程序員技術文檔HTML5開發中的javascript閉包

好程序員技術文檔HTML5開發中的javascript閉包&#xff0c;事實上&#xff0c;通過使用閉包&#xff0c;我們可以做很多事情。比如模擬面向對象的代碼風格;更優雅&#xff0c;更簡潔的表達出代碼;在某些方面提升代碼的執行效率&#xff0c;同時避免對命名空間的污染&#xff0c…

亞馬遜echo中國使用_如何使用亞馬遜的主要照片備份所有照片

亞馬遜echo中國使用Millions of people are Amazon Prime subscribers, but many of them don’t realize that in addition to free shipping and Prime Instant Video, they also get unlimited photo storage for all their computers and mobile devices. 數以百萬計的人是…

抽象SQL查詢:SQL-MAP技術的使用

什么是參數化查詢&#xff1f;我們來看百度百科對此的定義和示例&#xff1a; 一&#xff0c;定義 ------------------------------------------------------------------ 參數化查詢&#xff08;Parameterized Query 或 Parameterized Statement&#xff09;是指在設計與數據庫…

EF ORM

//新增UserInfo userInfo new UserInfo();userInfo.UserName "YANG";userInfo.UserPass "123";userInfo.Email "253qq.com";userInfo.RegTime System.DateTime.Now;Model1Container db new Model1Container();db.UserInfoSet.Add(userInfo…

如何使用echo.js實現圖片的懶加載(整理)

如何使用echo.js實現圖片的懶加載&#xff08;整理&#xff09; 一、總結 一句話總結&#xff1a;a、在img標簽中添加data-echo屬性加載真實圖片&#xff1a;<img class"loading" src"blank.gif" data-echo"圖片真實路徑" />&#xff0c;在…

還原出廠設置 擦除frp_如何備份,擦除和還原Apple Watch

還原出廠設置 擦除frpThe Apple Watch is, in its own right, a little tiny computer with data backup and security needs. Read on as we show you how to ensure your Apple Watch is backed up, wiped, and restored just like you’d do with your smartphone. Apple Wa…

exchange 2010 search mailbox 的幕后強大功能

鈴……….半夜中被一陣急促的手機鈴聲吵醒&#xff0c;年度服務客戶打來電話需要進行郵件的排查和刪除工作。問其原因&#xff0c;原來是組織中有人發了一封關于領導的不健康的郵件&#xff0c;并在企業內部進行了轉發&#xff0c;領導要求立即找出此類郵件并進行刪除。管理員深…