1. 程式人生 > >Tomcat 8(七)解讀Bootstrap

Tomcat 8(七)解讀Bootstrap

上一篇文章分析了通過startup.bat啟動Tomcat相當於執行如下程式碼,即執行Bootstrap start

  1. start "Tomcat" "C:\Program Files\Java\jdk1.7.0_51\bin\java"  
  2. -Djava.util.logging.config.file="D:\Program Files\apache-tomcat-8.0.3\conf\logging.properties"  
  3. -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager  
  4. -Djava.endorsed.dirs="D:\Program Files\apache-tomcat-8.0.3\endorsed"  
  5. -classpath "D:\Program Files\apache-tomcat-8.0.3\bin\bootstrap.jar;D:\Program Files\apache-tomcat-8.0.3\bin\tomcat-juli.jar"  
  6. -Dcatalina.base="D:\Program Files\apache-tomcat-8.0.3"  
  7. -Dcatalina.home="D:\Program Files\apache-tomcat-8.0.3"  
  8. -Djava.io.tmpdir="D:\Program Files\apache-tomcat-8.0.3\temp"  
  9. org.apache.catalina.startup.Bootstrap start  

今天來看看Bootstrap的執行流程

1. 執行static

為什麼沒有執行main方法,而先執行static塊呢?

原來一個類的執行,JVM做會以下幾件事情:類裝載、連結、初始化、例項化,而初始化階段做的事情是初始化靜態變數和執行靜態方法等

static塊的作用是設定catalinaBaseFile、catalinaHomeFile

static塊:

  1. static {  
  2.         // Will always be non-null
  3.         //System.getProperty("user.dir"),獲取當前目錄
  4.         //由於是在$CATALINA_HOME\bin下執行的Bootstrap,所以userDir為$CATALINA_HOME\bin
  5.         String userDir = System.getProperty("user.dir");  
  6.         // Home first
  7.         //Globals是存放全域性常量的類
  8.         //Globals.CATALINA_HOME_PROP = "catalina.home"
  9.         //catalina.home在執行Bootstrap時已設定(Tomcat的根目錄)
  10.         String home = System.getProperty(Globals.CATALINA_HOME_PROP);  
  11.         File homeFile = null;  
  12.         //獲取Tomcat的絕對路徑
  13.         if (home != null) {  
  14.             File f = new File(home);  
  15.             try {  
  16.                 homeFile = f.getCanonicalFile();  
  17.             } catch (IOException ioe) {  
  18.                 homeFile = f.getAbsoluteFile();  
  19.             }  
  20.         }  
  21.         if (homeFile == null) {  
  22.             // First fall-back. See if current directory is a bin directory
  23.             // in a normal Tomcat install
  24.             File bootstrapJar = new File(userDir, "bootstrap.jar");  
  25.             if (bootstrapJar.exists()) {  
  26.                 File f = new File(userDir, "..");  
  27.                 try {  
  28.                     homeFile = f.getCanonicalFile();  
  29.                 } catch (IOException ioe) {  
  30.                     homeFile = f.getAbsoluteFile();  
  31.                 }  
  32.             }  
  33.         }  
  34.         if (homeFile == null) {  
  35.             // Second fall-back. Use current directory
  36.             File f = new File(userDir);  
  37.             try {  
  38.                 homeFile = f.getCanonicalFile();  
  39.             } catch (IOException ioe) {  
  40.                 homeFile = f.getAbsoluteFile();  
  41.             }  
  42.         }  
  43.         //設定catalinaHomeFile
  44.         catalinaHomeFile = homeFile;  
  45.         System.setProperty(  
  46.                 Globals.CATALINA_HOME_PROP, catalinaHomeFile.getPath());  
  47.         // Then base
  48.         String base = System.getProperty(Globals.CATALINA_BASE_PROP);  
  49.         //設定catalinaBaseFile
  50.         if (base == null) {  
  51.             catalinaBaseFile = catalinaHomeFile;  
  52.         } else {  
  53.             File baseFile = new File(base);  
  54.             try {  
  55.                 baseFile = baseFile.getCanonicalFile();  
  56.             } catch (IOException ioe) {  
  57.                 baseFile = baseFile.getAbsoluteFile();  
  58.             }  
  59.             catalinaBaseFile = baseFile;  
  60.         }  
  61.         System.setProperty(  
  62.                 Globals.CATALINA_BASE_PROP, catalinaBaseFile.getPath());  
  63.     }  

對比getAbsoluteFile()、getCanonicalFile()

getAbsoluteFile獲取絕對檔案(如果檔案路徑中包含...,不解析)

getCanonicalFile獲取經典檔案(如果檔案路徑中包含...,解析)

建立Test.Java

  1. import java.io.File;  
  2. import java.io.IOException;  
  3. publicclass Test {  
  4.     publicstaticvoid main(String[] args) throws IOException {  
  5.         File f = new File("D://Program Files//apache-tomcat-8.0.3");  
  6.         File aFile = f.getAbsoluteFile();  
  7.         File bFile = f.getCanonicalFile();  
  8.         System.out.println("檔案路徑不包含.或..");  
  9.         System.out.println("getAbsoluteFile()--->" + aFile.toString());  
  10.         System.out.println("getCanonicalFile()--->" + bFile.toString());  
  11.         File f1 = new File("D://Program Files//apache-tomcat-8.0.3//..");  
  12.         File aFile1 = f1.getAbsoluteFile();  
  13.         File bFile1 = f1.getCanonicalFile();  
  14.         System.out.println("檔案路徑包含.或..");  
  15.         System.out.println("getAbsoluteFile()--->" + aFile1.toString());  
  16.         System.out.println("getCanonicalFile()--->" + bFile1.toString());  
  17.     }  
  18. }  

輸出:

  1. 檔案路徑不包含.或..  
  2. getAbsoluteFile()--->D:\Program Files\apache-tomcat-8.0.3  
  3. getCanonicalFile()--->D:\Program Files\apache-tomcat-8.0.3  
  4. 檔案路徑包含.或..  
  5. getAbsoluteFile()--->D:\Program Files\apache-tomcat-8.0.3\..  
  6. getCanonicalFile()--->D:\Program Files  

接寫來將執行main函式(以下以首次執行Bootstrap start進行解讀)

2. 執行main函式

main函式:

  1. publicstaticvoid main(String args[]) {  
  2.         if (daemon == null) {  
  3.             // Don't set daemon until init() has completed
  4.     //***2.1***
  5.             Bootstrap bootstrap = new Bootstrap();  
  6.             try {  
  7. 相關推薦

    Tomcat 8解讀Bootstrap

    上一篇文章分析了通過startup.bat啟動Tomcat相當於執行如下程式碼,即執行Bootstrap start start "Tomcat" "C:\Program Files\Java\jdk1.7.0_51\bin\java"   -

    MySQL數據庫8列類型

    最終 字段名 但是 ont 表示 英文 保存 15位 結果 列類型 整數類型 tinyint 迷你整型,系統采用一個字節來保存的整型,一個字節=8byte,最大能表示的數據是0-255。 smallint 小整型,系統采用兩個字節來保存的整型,能表示0-65535之間的整型

    Tomcat 8Tomcat常用配置

    作業系統:win8 Jdk版本:1.7.0_51 Jdk目錄:C:\Program Files\Java\jdk1.7.0_51 Tomcat版本:8.0.3  Tomcat目錄:D:\Program Files\apache-tomcat-8.0.3 注:Tomcat 

    AngularJs的UI組件ui-Bootstrap分享——Buttons和Dropdown

    pre led str 屬性表 clas menu 組合 代碼 pan 原文地址:http://www.cnblogs.com/pilixiami/p/5636218.html 在ui-Bootstrap中,Buttons控件和Dropdown控件與form表單中的按鈕

    菜鳥學習資料庫——Windows 10安裝MySQL 8.0.12 解壓版

    下載 下載地址 解壓 解壓到你想要的位置 配置環境變數 新建 MYSQL_HOME ,對應的值為你剛剛解壓的目錄,如D:\mysql-8.0.12-winx64。在path中新增 %MYSQL_HOME%\bin 。 初始化 在MySQL根目錄下新建 my.

    Bootstrap導航 & 導航條 & 分頁導航

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev

    跟我學 Java 8 新特性之 Stream 流流與迭代器,流系列大結局

    恭喜你們,馬上就要學完Java8 Stream流的一整系列了,其實我相信Stream流對很多使用Java的同學來說,都是一個知識盲點,因為這個原因,我才這麼細緻地講解Stream流的各個知識點,通過這一整個系列,我相信只要認真看了的同學,都已掌握的差不多了,就差實戰了。

    Eclipse 4.8.0 photon 如何建立dynamic web project並完成Tomcat配置

    一、檢視eclipse版本,不同版本遇到的問題可能不一樣。我是Photon Realease(4.8.0)。 步驟:Help -> About Eclipse IDE 開啟後窗口如下可視: 二、建立dynamic web project 在該版本中,是沒

    從零開始學 Web 之 移動WebBootstrap

    一、常見的響應式框架 隨著Web應用變的越來越複雜,在大量的開發過程中我們發現有許多功能模組非常相似,比如輪播圖、分頁、選項卡、導航欄等,開發中往往會把這些具有通用性的功能模組進行一系列封裝,使之成為一個個元件應用到專案中,可以極大的節約開發成本,將這些通用的元件縮合到一起就形成了前端框架。 常見的響應式

    Java容器:重新認識HashMapJava1.8和Java1.7中HashMap的差異

    摘要 HashMap是Java程式設計師使用頻率最高的用於對映(鍵值對)處理的資料型別。隨著JDK(Java Developmet Kit)版本的更新,JDK1.8對HashMap底層的實現進行了優化,例如引入紅黑樹的資料結構和擴容的優化等。本文結合JDK1.7和JDK1.

    Tomcat原始碼分析 ----- Tomcat 啟動過程(二)

    在上一篇文章中,我們分析了tomcat的初始化過程,是由Bootstrap反射呼叫Catalina的load方法完成tomcat的初始化,包括server.xml的解析、例項化各大元件、初始化元件等邏輯。那麼tomcat又是如何啟動webapp應用,又是如何載入應用程式的ServletContextListe

    小白學 Python 資料分析8:Pandas 資料預處理

    人生苦短,我用 Python 前文傳送門: 小白學 Python 資料分析(1):資料分析基礎 小白學 Python 資料分析(2):Pandas (一)概述 小白學 Python 資料分析(3):Pandas (二)資料結構 Series 小白學 Python 資料分析(4):Pandas (三)資

    設計模式學習總結適配器模式(Adapter)

    實現接口 國外 手機 額外 sed ges program ebe 通過   適配器模式主要是通過適配器來實現接口的統一,如要實現國內手機在國外充電,則需要在不同的國家采用不同的適配器來進行兼容!   一、示例展示:   以下例子主要通過給筆記本電腦添加類似手機打電話和發短

    Docker網絡

    docker 網絡 dns networking 容器和宿主機、容器之間以及誇主機容器如何通訊呢?這就需要使用到Docker網絡。在前面的介紹中我們在Dockerfile中通過EXPOSE參數來設置容器暴露的端口,讓在docker run中使用-p來設置宿主機端口到容器端口的映射,這只是最簡單

    團隊沖刺階段

    logs family 註冊 ges com 初步 宋體 登錄註冊 技術分享 站立會議:    任務進度:   目前學生登錄註冊界面已經初步完成,正在完成跳轉操作;老師網頁也在潤色中,目前初步完成。 任務面板: 燃盡圖: 團隊沖刺階段(七)

    【OpenGL】Shader實例分析- 雪花飄落效果

    mouse llb cto 接下來 pix lan details effect art 轉發請保持地址:http://blog.csdn.net/stalendp/article/details/40624603 研究了一個雪花飄落效果。感覺挺不錯的。分享給大家,效

    下午 拓展 今天 代碼 一點 留下 之前 沒有 問題 還是上次遺留下的空指針問題 明明是對的非說有空指針 今天還出現卡死的情況 感覺越來越糟 現在回過頭看之前的代碼有點亂 明天開始重新把類 理一下 提高拓展性 今天從下午找到晚上還是沒有什麽結果 好氣 還是得總頭到尾自己

    Hibernate中使用JDBC

    alt work 方法 代碼 cep cti 一個 sdm admin 在hibernate中獲取connection數據庫連接有兩種方法:(操作數據庫常用這種方法) 1. session.doReturningWork 返回一個對象,適用於查詢方法 2. ses

    黑盒測試用例設計-正交試驗方法

    nbsp 出現 logs 因果圖 設計 步驟 引入 常用 因子和 6.正交試驗方法 第4節結尾提到,因果關系非常龐大,導致由此得到的測試用例數目多大。因而引入正交試驗法,從大量的試驗數據中挑選適量的、有代表性的點安排測試,來有效地、合理地減少測試的工時。 (1

    Centos7系列邏輯卷詳解

    centos7 邏輯卷 博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什麽疑問的朋友可以聯系博主,博主會幫你們解答,謝謝支持!Centos7可以用xfs_growfs來擴大XFS文件系統,用resize2fs 來擴大ext4文件系統,註意的是 XFS