日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

tomcat的class加载的优先顺序

發布時間:2023/12/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tomcat的class加载的优先顺序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

  • 最先是$JAVA_HOME/jre/lib/ext/下的jar文件。
  • 環境變量CLASSPATH中的jar和class文件。
  • \$CATALINA_HOME/common/classes下的class文件。
  • \$CATALINA_HOME/commons/endorsed下的jar文件。
  • \$CATALINA_HOME/commons/i18n下的jar文件。
  • \$CATALINA_HOME/common/lib 下的jar文件。(JDBC驅動之類的jar文件可以放在這里,這樣就可以避免在server.xml配置好數據源卻出現找不到JDBC Driver的情況。)
  • \$CATALINA_HOME/server/classes下的class文件。
  • \$CATALINA_HOME/server/lib/下的jar文件。
  • \$CATALINA_BASE/shared/classes 下的class文件。
  • \$CATALINA_BASE/shared/lib下的jar文件。
  • 各自具體的webapp /WEB-INF/classes下的class文件。
  • 各自具體的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的錯誤。

    總結

    以上是生活随笔為你收集整理的tomcat的class加载的优先顺序的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。