解析Tomcat的啟動腳本--startup.bat
概述
我們通常使用 Tomcat 中的 startup.bat 來啟動 Tomcat. 但是這其中干了一些什么事呢?
大家都知道一個 Java 程序需要啟動的話, 肯定需要 main 方法, 那么這個 main 方法在哪呢?
Tomcat 腳本中又是配置了一些什么參數(shù)呢, 什么情況下 Tomcat 會啟動失敗呢?
帶著一些列的疑問我們來分析 Tomcat 的三個最重要的啟動腳本:
- startup.bat
- catalina.bat
- setclasspath.bat
startup.bat 腳本
該腳本主要做了以下幾件事:
- 設(shè)置 CATALINA_HOME 環(huán)境變量的值
- 找到 catalina.bat 腳本
- 調(diào)用 catalina.bat 腳本, 并把參數(shù)傳過去
貼出簡化版本的 startup.bat 腳本的內(nèi)容
@echo off rem 執(zhí)行這個命令之后, 增加或者改動的環(huán)境變量只限于匹配到 endlocal 命令或者到達(dá)文件末尾. setlocal rem 假設(shè) CATALINA_HOME 環(huán)境變量沒有定義 rem 取當(dāng)前目錄的路徑值, 賦給 CURRENT_DIR 變量, 就是 ./apache-tomcat-x.x.xx/bin set "CURRENT_DIR=%cd%" rem 如果 CATALINA_HOME 變量值不是 "" 的話, 調(diào)到 gotHome 標(biāo)簽處 if not "%CATALINA_HOME%" == "" goto gotHome rem 如果 CATALINA_HOME 是 "" 的話, 設(shè)置 CATALINA_HOME 變量值為 當(dāng)前目錄的路徑值(./apache-tomcat-x.x.xx/bin) set "CATALINA_HOME=%CURRENT_DIR%" rem 判斷當(dāng)前路徑下的是否有 bin\catalina.bat, 也就是 ./apache-tomcat-x.x.xx/bin/bin/catalina.bat rem 如果存在的話, 直接調(diào)到 okHome 標(biāo)簽處, 顯然是不存在的 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome rem 不存在的話, CATALINA_HOME 取上級目錄的值, 也就是(./apache-tomcat-x.x.xx/) cd .. set "CATALINA_HOME=%cd%" rem 進(jìn)入 CURRENT_DIR(./apache-tomcat-x.x.xx/bin) cd "%CURRENT_DIR%" :gotHome rem 通過上面的設(shè)置, CATALINA_HOME 的值已經(jīng)是: ./apache-tomcat-x.x.xx/ rem 所以整理是可以找到 catalina.bat 腳本的, 直接調(diào)到 okHome 標(biāo)簽處 if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome echo The CATALINA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program goto end :okHome rem 設(shè)置 EXECUTABLE 變量指向為 catalina.bat 腳本 set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat" rem 檢查目標(biāo)可執(zhí)行文件(catalina.bat)是否存在, 通常情況下是存在的, 直接調(diào)到 okExec 標(biāo)簽處 rem 如果不存在的話, 直接退出. 啟動 Tomcat 結(jié)束 if exist "%EXECUTABLE%" goto okExec echo Cannot find "%EXECUTABLE%" echo This file is needed to run this program goto end :okExec rem 獲取剩余的沒有用 shift 取出來的命令行參數(shù), 并保存它們在 CMD_LINE_ARGS set CMD_LINE_ARGS= :setArgs rem 如果第一個命令行參數(shù)是空的話, 跳到 doneSetArgs 標(biāo)簽處 rem "%1" : 表示執(zhí)行命令之后的第一個參數(shù) if ""%1""=="""" goto doneSetArgs rem 第一個參數(shù)不是空的話, 拼接到 CMD_LINE_ARGS 變量 set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 rem 這個命令可以自行百度 shift goto setArgs :doneSetArgs rem 上面設(shè)置了 EXECUTABLE 變量的值是指向了 catalina.bat 腳本, 這個利用 call 命令執(zhí)行調(diào)用, 并把參數(shù)傳進(jìn)去 rem 接下來, 咱們看 catalina.bat 腳本的內(nèi)容 rem 完整的命令: ./apache-tomcat-x.x.xx/bin/catalina.bat start call "%EXECUTABLE%" start %CMD_LINE_ARGS% :end
要想理解腳本中的一些命令, 首先來了解一下常用的命令(我們用的 Window 版的)
- rem : 該命令后的代碼不會被執(zhí)行, 相當(dāng)于注釋
- @echo off : 關(guān)閉命令的顯示, 如果沒有設(shè)置, 執(zhí)行了哪些命令都會顯示出來
- echo : 輸出后面的內(nèi)容
- setlocal : 執(zhí)行這個命令之后, 增加或者改動的環(huán)境變量的作用范圍只限于匹配到 endlocal 命令或者到達(dá)文件末尾.
- set : 設(shè)置一個變量
- :xxx : 定義一個標(biāo)簽
- goto : 跳轉(zhuǎn)到制定的標(biāo)簽處
- call : 執(zhí)行命令
我們來一行行分析 startup.bat 腳本
set "CURRENT_DIR=%cd%"
%cd% : 表示文件所在的目錄的路徑
如果我們解壓的 Tomcat 所在的目錄為 D:/apache-tomcat-x.x.x/ . 因為 startup.bat 命令在 bin 目錄下, 所以此時 %cd% 表示的目錄是 D:/apache-tomcat-x.x.x/bin
if not "%CATALINA_HOME%" == "" goto gotHome
我們通常情況下不會配置 CATALINA_HOME 這個環(huán)境變量的, 所以這里不會調(diào)到 gotHome 標(biāo)簽處.
set "CATALINA_HOME=%CURRENT_DIR%"
直接把當(dāng)前目錄假設(shè)為 CATALINA_HOME 的值
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
然后通過固定的格式來判斷一下是否有 catalina.bat 腳本, 當(dāng)然這里是肯定不會存在的, 因為 CATALINA_HOME = D:/apache-tomcat-x.x.x/bin
cd .. set "CATALINA_HOME=%cd%"
因為 Tomcat 的目錄格式是固定的, 所以這里直接進(jìn)入上級目錄(cd ..), 然后設(shè)置 CATALINA_HOME 的值為上級目錄( D:/apache-tomcat-x.x.x ).
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome echo The CATALINA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program goto end
繼續(xù)往下看, 這里又一次判斷了一下 catalina.bat 在這樣的目錄結(jié)構(gòu)是是否能找到, 如果我們解壓完 Tomcat 后, 把 startup.bat 放在非 Tomcat 的 bin 目錄下之后, 這里是找不到的, 就直接 goto end, 退出 Tomcat 的啟動.
好了, 這里我們直接調(diào)到 okHome 標(biāo)簽處.
:okHome set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
好了, 這里很簡單, 設(shè)置一個 EXECUTABLE 變量的值指向 catalina.bat 腳本.
if exist "%EXECUTABLE%" goto okExec echo Cannot find "%EXECUTABLE%" echo This file is needed to run this program goto end
又一次的檢查了一下這個腳本是否存在, 存在的話, 直接調(diào)到 okExec 標(biāo)簽處, 可以執(zhí)行了.
如果沒有通過檢查的話, 依舊退出啟動, 并打印錯誤信息.
:okExec set CMD_LINE_ARGS= :setArgs if ""%1""=="""" goto doneSetArgs set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 shift goto setArgs
先設(shè)置了一個 CMD_LINE_ARGS 變量, 并且其值暫且為空
這里出現(xiàn)了一個 ""%1""=="""", 拆開看 就是判斷 "%1" 是否等于 "". 那么 "%1" 又是什么呢?
這是 window 批處理的一個語法, 表示的是執(zhí)行命令之后的第一個參數(shù), 對于這里, 我們并沒有傳遞什么參數(shù), 所以這里的 "%1" 是 ""(空).
直接跳轉(zhuǎn)到 doneSetArgs 標(biāo)簽處.
如果不是空的話, 就拼在后面唄.
這里這個 shift 命令意思就是移除一個參數(shù), 舉個例子就知道了:
@echo off echo "%1" shift echo "%1"
建一個 test.bat 批處理程序, 然后把上面代碼復(fù)制進(jìn)去, 在 cmd 中執(zhí)行并給它兩個參數(shù)
下面是執(zhí)行結(jié)果, 這里大家可以把 @echo off 去掉再執(zhí)行, 驗證一下這個命令的作用
PS D:\> .\test Hello World "Hello" "World" PS D:\>
這樣, 大家應(yīng)該可以理解了.
繼續(xù)分析
:doneSetArgs call "%EXECUTABLE%" start %CMD_LINE_ARGS% :end
在上面設(shè)置了 EXECUTABLE = %CATALINA_HOME%\bin\catalina.bat , 所以這里實際上是調(diào)用了 catalina.bat 這個腳本, 然后傳遞一個 start 參數(shù)給它.
如果我們在 cmd 中運(yùn)行 startup.bat 并且后面跟著一些參數(shù)的話, 這里也一起傳遞過去了.
這里實際上就是執(zhí)行了: %CATALINA_HOME%\bin\catalina.bat start
總結(jié)
這個腳本還是挺簡單的, 目的就是找到 catalina.bat 并調(diào)用它.
以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,下篇繼續(xù)介紹Tomcat相關(guān)知識--《解析Tomcat的啟動腳本--catalina.bat》,有興趣的朋友可以看下
相關(guān)文章
IDEA 配置Tomcat服務(wù)器和發(fā)布web項目的圖文教程
這篇文章主要介紹了IDEA 配置Tomcat服務(wù)器和發(fā)布web項目的教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11解決Tomcat啟動報錯Publishing?failed??multiple問題
這篇文章主要介紹了解決Tomcat啟動報錯Publishing?failed??multiple問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-09-09TOMCAT啟動失敗using?catalina_opts為空的解決方法
這篇文章主要給大家分享了TOMCAT啟動失敗using?catalina_opts為空的解決方法,文中有詳細(xì)的解決流程,具有一定的參考價值,需要的朋友可以參考下2023-10-10Tomcat下載安裝并部署到IDEA的教程(附帶idea兩種熱部署設(shè)置方法)
這篇文章主要介紹了Tomcat下載安裝并部署到IDEA的教程(附帶idea兩種熱部署設(shè)置方法),本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12Tomcat部署時war和war exploded區(qū)別及問題匯總
這篇文章主要介紹了Tomcat部署時war和war exploded區(qū)別的相關(guān)資料,需要的朋友可以參考下2017-06-06