1、 Apache Tomcat的下載和安裝
從Apache官網https://tomcat.apache.org/可以下載各種版本的tomcat軟體,下載的檔案格式可以是zip/tar.gz/exe形式的。
如下圖所示,在64位windows中使用tomcat,我們可以下載"64-bit Windows.zip",直接解壓縮就可以使用;或者下載"32-bit/64-bit Windows Service Installer",透過exe安裝tomcat後使用。
2、 tomcat的bin目錄無論哪種形式獲得的tomcat伺服器軟體,在tomcat的主目錄下都有一個bin目錄,該bin目錄中存在tomcat伺服器啟動、停止和執行所必須的批處理/SHELL指令碼、exe可執行程式和一些jar包。
本文只介紹其中的startup.bat指令碼程式,該指令碼程式透過呼叫其他指令碼用於啟動tomcat伺服器。
3、 startup.bat指令碼的主要功能該指令碼功能很簡單,主要實現兩方面的功能:找到catalina.bat指令碼,該指令碼用於實際啟動tomcat伺服器;組織引數傳遞給catalina.bat,呼叫call該指令碼執行。
4、 startup.bat指令碼詳細執行過程下面文字刪掉了startup.bat指令碼檔案的英文註釋,只保留了指令碼中可以實際執行的語句,分析了每一條語句的功能。
另,分析的文字放在了rem註釋中。rem註釋中多數為漢字,作業系統解釋該指令碼時有時會和後續行的指令發生勾連,造成指令碼執行報錯。故,每個rem註釋語句的最後添加了一個英文形式的點號,這樣指令碼能正常執行。
另,下面的指令碼在tomcat9.0的startup.bat基礎上做了些許修改,確保該指令碼不僅僅可以完成tomcat的啟動操作,其他如stop操作等都可以正常執行。
------ startup.bat ----
@echo off
rem @echo off從本條命令開始關閉回顯,如果是echo off則是從下條命令開始關閉回顯.
rem 關閉回顯是執行bat檔案時,在cmd視窗看不到bat執行的命令,但可以看到輸出結果.
rem 打開回顯,則執行的命令和輸出在cmd視窗都能看到.
rem bat指令碼一般第一條指令就是這條.
setlocal
rem 設定區域性於setlocal和endlocal之間的變數,沒有endlocal就直接到bat檔案結尾處.
set "CURRENT_DIR=%cd%"
rem %cd%:指令碼執行的當前目錄,這裡的當前目錄有可能和指令碼實際所在目錄不一致.
rem %~dp0%:指令碼檔案所在目錄,注意,目錄的路徑為全路徑,並且帶結尾的\,前者不帶\.
rem 上面set語句將指令碼執行的當前目錄名賦給區域性變數CURRENT_DIR.
rem 如果CATALINA_HOME的內容不是空,即變數已經設定好了,則直接跳轉,不用再賦值了.
if not "%CATALINA_HOME%" == "" goto gotHome
rem 否則取出變數CURRENT_DIR的值賦給CATALINA_HOME這個環境變數.
set "CATALINA_HOME=%CURRENT_DIR%"
rem 若CATALINA_HOME下面的bin目錄下存在catalina.bat檔案,則直接跳轉,不用再賦值.
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
rem 否則向前退一級目錄後將目錄名賦給CATALINA_HOME,並轉到該目錄下.
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
:gotHome
rem 如果找到了catalina.bat,則轉到後面執行該批處理檔案.
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
rem 否則找不到catalina.bat檔案,在cmd視窗回顯下面的提示,跳轉到end,結束指令碼執行.
echo The CATALINA_HOME environment variable is not defined correctly
echo This environment variable is needed to run this program
goto end
:okHome
rem 將catalina.bat的全路徑名賦給變數EXECUTABLE
set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"
rem 如果EXECUTABLE中的全路徑名存在,則轉到執行程式的位置執行啟動程式.
if exist "%EXECUTABLE%" goto okExec
rem 否則如果全路徑名不存在,提示不能執行啟動程式,跳轉到最後end結束指令碼執行.
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec
rem 設定startup.bat的命令列引數,初始化引數為空.
set CMD_LINE_ARGS=
:setArgs
rem 將startup.bat檔案的命令列引數儲存在CM_LINE_ARGS中.
rem 如果第一個位置的命令列引數為空,則結束拼裝命令列引數.
if ""%1""=="""" goto doneSetArgs
rem 將第一個引數併入命令列引數變數中.
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
rem 命令列引數中引數左移一位,即將第二個引數移到第一個引數的位置.
rem 第三個引數移到第二個引數的位置等等.
shift
rem 跳轉到:setArgs處,完成當前引數拼裝,當引數為空時跳出setArgs迴圈.
goto setArgs
:doneSetArgs
rem 執行該startup.bat檔案可以有如下的一些引數.
rem C>startup.bat
rem C>startup.bat start
rem C>startup.bat stop
rem C>startup.bat debug
rem C>startup.bat start -security
rem C>startup.bat run
rem C>startup.bat run -security
rem 只運行了startup.bat檔案,沒有指定命令列引數,預設就當成啟動操作.
rem 拼裝start引數給批處理程式.
if "%CMD_LINE_ARGS%" == "" set CMD_LINE_ARGS=start
echo 呼叫catalina.bat的命令:%EXECUTABLE% %CMD_LINE_ARGS%
rem 呼叫catalina.bat批處理指令碼檔案
call "%EXECUTABLE%" %CMD_LINE_ARGS%
:end