tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)
生活随笔
收集整理的這篇文章主要介紹了
tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【0】README
1)本文部分文字描述轉自:“深入剖析tomcat”,旨在學習“tomcat啟動腳本分析”?的相關知識;
2)for tomcat4 startup files, please visit?https://github.com/pacosonTang/HowTomcatWorks/tree/master/supplement/tomcat4_bin
【1】Windows平臺的啟動腳本 1)分析catalina.bat 批處理文件的內容:(catalina.bat) step1)首先使用 @echo off 命令隱藏命令的顯示; step2)然后檢查環境變量OS的值是否為 “Windows_NT”;即用戶使用的是否是 window os 的相應distribution;如果是,它就調用 setLocal 命令將對環境變量的修改控制在當前批處理文件中:if "%OS%" == "Windows_NT" setlocal step3)然后,如果先前沒有設置變量 CATALINA_HOME 的值,就在這里進行設置。默認case下,變量 CATALINE_HOME 是不存在的;如果顯然沒有設置過變量 CATALINA_HOME,那么批處理文件會猜測是從哪個文件目錄進行調用;(干貨——設置 環境變量CATALINA_HOME的值,該值應該被正確設置為bin的父目錄) step3.1)首先,它會假設catalina.bat 文件是在安裝目錄中進行調用的。那么在bin目錄下就一定存在一個 catalina.bat 的文件: if not "%CATALINA_HOME%" == "" goto gotHome set CATALINA_HOME=. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome step3.2)如果在當前目錄的子目錄bin下沒有找到catalina.bat 文件;批處理文件會再猜測一次;這次,它還會假設catalina.bat 文件是在安裝目錄的bin 命令下調用的,但是會將變量 CATALINA_HOME 設置為當前目錄的父目錄,并檢查 catalina.bat 是否存在于 bin目錄中; set CATALINA_HOME=.. :gotHome if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome step3.3)如果這次猜測正確,就跳轉到 okHome標簽所在位置繼續運行;否則,它輸出錯誤消息,告訴用戶變量 CATALINA_HOME 設置錯誤,并跳轉到end標簽所在位置。end標簽在批處理文件的末尾,會退出腳本執行; echo The CATALINA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program goto end :okHome step3.4)如果CATALINE_HOME 設置正確,并且setenv.bat 文件存在的話,會調用 setenv.bat 批處理腳本來設置需要的環境變量。如果 setenv.bat 文件不存在,就輸出錯誤消息;(干貨——查看setenv.bat是否存在,存在的話就調用該文件設置環境變量) rem Get standard environment variables if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" step4)接下來,它檢查 setclasspath.bat 是否存在?如果不存在,它輸出一條錯誤消息,并跳轉到end標簽所在的位置,退出批處理文件;(干貨——查看 setclasspath.bat文件是否存在,存在的話定義變量BASEDIR=%CATALINA_HOME%)setclasspath.bat rem Get standard Java environment variables if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat echo This file is needed to run this program goto end step4.1)如果存在,它就定義變量 BASEDIR,并賦值為環境變量 CATALINA_HOME 的值,然后,調用 setclasspath.bat 批處理文件設置類路徑: :okSetclasspath set BASEDIR=%CATALINA_HOME% call "%CATALINA_HOME%\bin\setclasspath.bat" step4.2)setclasspath.bat 文件會檢查環境變量 JAVA_HOME 是否設置正確,并設置將會在 catalina.bat 批處理文件中所要用到的變量:(干貨——調用setclasspath.bat 設置類路徑) set JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed set CLASSPATH=%JAVA_HOME%\lib\tools.jar set _RUNJAVA="%JAVA_HOME%\bin\java" set _RUNJAVAW="%JAVA_HOME%\bin\javaw" set _RUNJDB="%JAVA_HOME%\bin\jdb" set _RUNJAVAC="%JAVA_HOME%\bin\javac" step5)接下來,catalina.bat 文件會檢查是否安裝了 Java Secure Socket Extension(JSSE),以及環境變量 JSSE_home 是否設置正確。如果存在環境變量 JSSE_HOME,將其添加到環境變量CLASSPATH中:(干貨——檢查JSSE_home?環境變量是否設置) if "%JSSE_HOME%" == "" goto noJsse set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar :noJsse step5.1)如果沒有設置環境變量 JSSE_HOME,批處理文件會繼續執行下面的目錄,將bin目錄下的 bootstrap.jar 添加到 環境變量 CLASSPATH 中; set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar step6)接下來,檢查環境變量 CATALINA_BASE 是否設置,若沒有設置則將 CATALINE_HOME的值賦給它;(干貨——檢查CATALINA_BASE?環境變量是否設置) if not "%CATALINA_BASE%" == "" goto gotBase set CATALINA_BASE=%CATALINA_HOME% :gotBase step6.1)接著會檢查變量 %CATALINA_TMPDIR% 是否設置,若沒有設置的話,將其設置為 CATALINE_BASE 下的臨時目錄; if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir set CATALINA_TMPDIR=%CATALINA_BASE%\temp :gotTmpdir step6.2)接著,顯示一些變量的值; echo Using CATALINA_BASE: %CATALINA_BASE% echo Using CATALINA_HOME: %CATALINA_HOME% echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR% echo Using JAVA_HOME: %JAVA_HOME% step7)然后,它將 在setclasspath.bat 中設置的變量 _RUNJAVA 的值賦給 _EXECJAVA。(干貨——為一些環境變量賦值) set _EXECJAVA=%_RUNJAVA% step7.1)它再設置如下的環境變量: set MAINCLASS=org.apache.catalina.startup.Bootstrap // 設置啟動目錄; set ACTION=start set SECURITY_POLICY_FILE= set DEBUG_OPTS= set JPDA= public static void main(String args[]) {//org.apache.catalina.startup.Bootstrap.main().// Set the debug flag appropriatelyfor (int i = 0; i < args.length; i++) {if ("-debug".equals(args[i]))debug = 1;}// Configure catalina.base from catalina.home if not yet setif (System.getProperty("catalina.base") == null)System.setProperty("catalina.base", getCatalinaHome());// Construct the class loaders we will needClassLoader commonLoader = null;ClassLoader catalinaLoader = null;ClassLoader sharedLoader = null;try {File unpacked[] = new File[1];File packed[] = new File[1];File packed2[] = new File[2];ClassLoaderFactory.setDebug(debug);unpacked[0] = new File(getCatalinaHome(),"common" + File.separator + "classes");packed2[0] = new File(getCatalinaHome(),"common" + File.separator + "endorsed");packed2[1] = new File(getCatalinaHome(),"common" + File.separator + "lib");commonLoader =ClassLoaderFactory.createClassLoader(unpacked, packed2, null);unpacked[0] = new File(getCatalinaHome(),"server" + File.separator + "classes");packed[0] = new File(getCatalinaHome(),"server" + File.separator + "lib");catalinaLoader =ClassLoaderFactory.createClassLoader(unpacked, packed,commonLoader);unpacked[0] = new File(getCatalinaBase(),"shared" + File.separator + "classes");packed[0] = new File(getCatalinaBase(),"shared" + File.separator + "lib");sharedLoader =ClassLoaderFactory.createClassLoader(unpacked, packed,commonLoader);} catch (Throwable t) {log("Class loader creation threw exception", t);System.exit(1);}Thread.currentThread().setContextClassLoader(catalinaLoader);// Load our startup class and call its process() methodtry {SecurityClassLoad.securityClassLoad(catalinaLoader);// Instantiate a startup class instanceif (debug >= 1)log("Loading startup class");Class startupClass =catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");Object startupInstance = startupClass.newInstance();// Set the shared extensions class loaderif (debug >= 1)log("Setting startup class properties");String methodName = "setParentClassLoader";Class paramTypes[] = new Class[1];paramTypes[0] = Class.forName("java.lang.ClassLoader");Object paramValues[] = new Object[1];paramValues[0] = sharedLoader;Method method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);// Call the process() methodif (debug >= 1)log("Calling startup class process() method");methodName = "process";paramTypes = new Class[1];paramTypes[0] = args.getClass();paramValues = new Object[1];paramValues[0] = args;method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);} catch (Exception e) {System.out.println("Exception during startup processing");e.printStackTrace(System.out);System.exit(2);}}
step8)接著,它會檢查傳入的第1個參數是否是 jpda(java platform debugger architecture);(干貨——判斷傳入的第1個參數是否是 jpda) step8.1)如果是:就設置變量 JPDA的值為 jpda,然后檢查變量 JPDA_TRANSPORT 和 變量 JPDA_ADDRESS的值,并移動參數: if not ""%1"" == ""jpda"" goto noJpda set JPDA=jpda if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport set JPDA_TRANSPORT=dt_shmem :gotJpdaTransport if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress set JPDA_ADDRESS=jdbconn :gotJpdaAddress shift step8.2)大多數case下,不需要使用 JPDA,因此,第1個參數的值必須是以下幾個中的一個: debug, embedded,run,start 或 stop; :noJpdaif ""%1"" == ""debug"" goto doDebug if ""%1"" == ""embedded"" goto doEmbedded if ""%1"" == ""run"" goto doRun if ""%1"" == ""start"" goto doStart if ""%1"" == ""stop"" goto doStop step8.3)如果第1個參數不正確,或沒有使用參數,則該批處理文件會退出; echo Usage: catalina ( commands ... ) echo commands: echo debug Start Catalina in a debugger echo debug -security Debug Catalina with a security manager echo embedded Start Catalina in embedded mode echo jpda start Start Catalina under JPDA debugger echo run Start Catalina in the current window echo run -security Start in the current window with security manager echo start Start Catalina in a separate window echo start -security Start in a separate window with security manager echo stop Stop Catalina goto end step9)如果參數是start,則跳轉到 doStart標簽后,catalina.bat(它)會調用 shift命令來檢查下一個參數;如果有第2個參數的話,那么它必須是 -security;否則,忽略它;如果下一個參數是 -security,會再次調用 shift命令,變量 SECURITY_POLICY_FILE 會被設置成為 %CATALINA_BASE%\conf\catalina.policy;(干貨——如果運行catalina.bat 批處理文件的參數是start) :doStart shift if not "%OS%" == "Windows_NT" goto noTitle set _EXECJAVA=start "Tomcat" %_RUNJAVA% goto gotTitle :noTitle set _EXECJAVA=start %_RUNJAVA% :gotTitle if not ""%1"" == ""-security"" goto execCmd shift echo Using Security Manager set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy step9.1)跳轉到 execCmd標簽處: goto execCmd step9.2)execCmd標簽下的 命令接收剩余未移動的命令行參數,將它們保存到 變量 CMD_LINE_ARGS 中,再跳轉到 doneSetArgs 標簽處: :execCmd rem Get remaining unshifted command line arguments and save them in the set CMD_LINE_ARGS= :setArgs if ""%1""=="""" goto doneSetArgs set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 shift goto setArgs step9.3)下面是?doneSetArgs 標簽處的代碼 :doneSetArgs rem Execute Java with the applicable properties if not "%JPDA%" == "" goto doJpda if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% goto end 對以上代碼的分析(Analysis):?例如在pc上,調用catalina.bat 文件,上面的代碼 會被轉換為下面的實際代碼:(從 %_EXECJAVA% 到 %ACTION%) start "Tomcat" "C:\jdk1.8.0_60\bin\java" -Djava.endorsed.dirs="..\common\endorsed" -classpath "C:\jdk1.8.0_60\lib\tools.jar;..\lib\bootstrap.jar" -Dcatalina.base=".." Dcatalina.home=".." -Djava.io.tmpdir="..\temp" org.apache.catalina.startup.Bootstrap start
【1】Windows平臺的啟動腳本 1)分析catalina.bat 批處理文件的內容:(catalina.bat) step1)首先使用 @echo off 命令隱藏命令的顯示; step2)然后檢查環境變量OS的值是否為 “Windows_NT”;即用戶使用的是否是 window os 的相應distribution;如果是,它就調用 setLocal 命令將對環境變量的修改控制在當前批處理文件中:if "%OS%" == "Windows_NT" setlocal step3)然后,如果先前沒有設置變量 CATALINA_HOME 的值,就在這里進行設置。默認case下,變量 CATALINE_HOME 是不存在的;如果顯然沒有設置過變量 CATALINA_HOME,那么批處理文件會猜測是從哪個文件目錄進行調用;(干貨——設置 環境變量CATALINA_HOME的值,該值應該被正確設置為bin的父目錄) step3.1)首先,它會假設catalina.bat 文件是在安裝目錄中進行調用的。那么在bin目錄下就一定存在一個 catalina.bat 的文件: if not "%CATALINA_HOME%" == "" goto gotHome set CATALINA_HOME=. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome step3.2)如果在當前目錄的子目錄bin下沒有找到catalina.bat 文件;批處理文件會再猜測一次;這次,它還會假設catalina.bat 文件是在安裝目錄的bin 命令下調用的,但是會將變量 CATALINA_HOME 設置為當前目錄的父目錄,并檢查 catalina.bat 是否存在于 bin目錄中; set CATALINA_HOME=.. :gotHome if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome step3.3)如果這次猜測正確,就跳轉到 okHome標簽所在位置繼續運行;否則,它輸出錯誤消息,告訴用戶變量 CATALINA_HOME 設置錯誤,并跳轉到end標簽所在位置。end標簽在批處理文件的末尾,會退出腳本執行; echo The CATALINA_HOME environment variable is not defined correctly echo This environment variable is needed to run this program goto end :okHome step3.4)如果CATALINE_HOME 設置正確,并且setenv.bat 文件存在的話,會調用 setenv.bat 批處理腳本來設置需要的環境變量。如果 setenv.bat 文件不存在,就輸出錯誤消息;(干貨——查看setenv.bat是否存在,存在的話就調用該文件設置環境變量) rem Get standard environment variables if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" step4)接下來,它檢查 setclasspath.bat 是否存在?如果不存在,它輸出一條錯誤消息,并跳轉到end標簽所在的位置,退出批處理文件;(干貨——查看 setclasspath.bat文件是否存在,存在的話定義變量BASEDIR=%CATALINA_HOME%)setclasspath.bat rem Get standard Java environment variables if exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspath echo Cannot find %CATALINA_HOME%\bin\setclasspath.bat echo This file is needed to run this program goto end step4.1)如果存在,它就定義變量 BASEDIR,并賦值為環境變量 CATALINA_HOME 的值,然后,調用 setclasspath.bat 批處理文件設置類路徑: :okSetclasspath set BASEDIR=%CATALINA_HOME% call "%CATALINA_HOME%\bin\setclasspath.bat" step4.2)setclasspath.bat 文件會檢查環境變量 JAVA_HOME 是否設置正確,并設置將會在 catalina.bat 批處理文件中所要用到的變量:(干貨——調用setclasspath.bat 設置類路徑) set JAVA_ENDORSED_DIRS=%BASEDIR%\common\endorsed set CLASSPATH=%JAVA_HOME%\lib\tools.jar set _RUNJAVA="%JAVA_HOME%\bin\java" set _RUNJAVAW="%JAVA_HOME%\bin\javaw" set _RUNJDB="%JAVA_HOME%\bin\jdb" set _RUNJAVAC="%JAVA_HOME%\bin\javac" step5)接下來,catalina.bat 文件會檢查是否安裝了 Java Secure Socket Extension(JSSE),以及環境變量 JSSE_home 是否設置正確。如果存在環境變量 JSSE_HOME,將其添加到環境變量CLASSPATH中:(干貨——檢查JSSE_home?環境變量是否設置) if "%JSSE_HOME%" == "" goto noJsse set CLASSPATH=%CLASSPATH%;%JSSE_HOME%\lib\jcert.jar;%JSSE_HOME%\lib\jnet.jar;%JSSE_HOME%\lib\jsse.jar :noJsse step5.1)如果沒有設置環境變量 JSSE_HOME,批處理文件會繼續執行下面的目錄,將bin目錄下的 bootstrap.jar 添加到 環境變量 CLASSPATH 中; set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar step6)接下來,檢查環境變量 CATALINA_BASE 是否設置,若沒有設置則將 CATALINE_HOME的值賦給它;(干貨——檢查CATALINA_BASE?環境變量是否設置) if not "%CATALINA_BASE%" == "" goto gotBase set CATALINA_BASE=%CATALINA_HOME% :gotBase step6.1)接著會檢查變量 %CATALINA_TMPDIR% 是否設置,若沒有設置的話,將其設置為 CATALINE_BASE 下的臨時目錄; if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir set CATALINA_TMPDIR=%CATALINA_BASE%\temp :gotTmpdir step6.2)接著,顯示一些變量的值; echo Using CATALINA_BASE: %CATALINA_BASE% echo Using CATALINA_HOME: %CATALINA_HOME% echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR% echo Using JAVA_HOME: %JAVA_HOME% step7)然后,它將 在setclasspath.bat 中設置的變量 _RUNJAVA 的值賦給 _EXECJAVA。(干貨——為一些環境變量賦值) set _EXECJAVA=%_RUNJAVA% step7.1)它再設置如下的環境變量: set MAINCLASS=org.apache.catalina.startup.Bootstrap // 設置啟動目錄; set ACTION=start set SECURITY_POLICY_FILE= set DEBUG_OPTS= set JPDA= public static void main(String args[]) {//org.apache.catalina.startup.Bootstrap.main().// Set the debug flag appropriatelyfor (int i = 0; i < args.length; i++) {if ("-debug".equals(args[i]))debug = 1;}// Configure catalina.base from catalina.home if not yet setif (System.getProperty("catalina.base") == null)System.setProperty("catalina.base", getCatalinaHome());// Construct the class loaders we will needClassLoader commonLoader = null;ClassLoader catalinaLoader = null;ClassLoader sharedLoader = null;try {File unpacked[] = new File[1];File packed[] = new File[1];File packed2[] = new File[2];ClassLoaderFactory.setDebug(debug);unpacked[0] = new File(getCatalinaHome(),"common" + File.separator + "classes");packed2[0] = new File(getCatalinaHome(),"common" + File.separator + "endorsed");packed2[1] = new File(getCatalinaHome(),"common" + File.separator + "lib");commonLoader =ClassLoaderFactory.createClassLoader(unpacked, packed2, null);unpacked[0] = new File(getCatalinaHome(),"server" + File.separator + "classes");packed[0] = new File(getCatalinaHome(),"server" + File.separator + "lib");catalinaLoader =ClassLoaderFactory.createClassLoader(unpacked, packed,commonLoader);unpacked[0] = new File(getCatalinaBase(),"shared" + File.separator + "classes");packed[0] = new File(getCatalinaBase(),"shared" + File.separator + "lib");sharedLoader =ClassLoaderFactory.createClassLoader(unpacked, packed,commonLoader);} catch (Throwable t) {log("Class loader creation threw exception", t);System.exit(1);}Thread.currentThread().setContextClassLoader(catalinaLoader);// Load our startup class and call its process() methodtry {SecurityClassLoad.securityClassLoad(catalinaLoader);// Instantiate a startup class instanceif (debug >= 1)log("Loading startup class");Class startupClass =catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");Object startupInstance = startupClass.newInstance();// Set the shared extensions class loaderif (debug >= 1)log("Setting startup class properties");String methodName = "setParentClassLoader";Class paramTypes[] = new Class[1];paramTypes[0] = Class.forName("java.lang.ClassLoader");Object paramValues[] = new Object[1];paramValues[0] = sharedLoader;Method method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);// Call the process() methodif (debug >= 1)log("Calling startup class process() method");methodName = "process";paramTypes = new Class[1];paramTypes[0] = args.getClass();paramValues = new Object[1];paramValues[0] = args;method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);} catch (Exception e) {System.out.println("Exception during startup processing");e.printStackTrace(System.out);System.exit(2);}}
step8)接著,它會檢查傳入的第1個參數是否是 jpda(java platform debugger architecture);(干貨——判斷傳入的第1個參數是否是 jpda) step8.1)如果是:就設置變量 JPDA的值為 jpda,然后檢查變量 JPDA_TRANSPORT 和 變量 JPDA_ADDRESS的值,并移動參數: if not ""%1"" == ""jpda"" goto noJpda set JPDA=jpda if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport set JPDA_TRANSPORT=dt_shmem :gotJpdaTransport if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress set JPDA_ADDRESS=jdbconn :gotJpdaAddress shift step8.2)大多數case下,不需要使用 JPDA,因此,第1個參數的值必須是以下幾個中的一個: debug, embedded,run,start 或 stop; :noJpdaif ""%1"" == ""debug"" goto doDebug if ""%1"" == ""embedded"" goto doEmbedded if ""%1"" == ""run"" goto doRun if ""%1"" == ""start"" goto doStart if ""%1"" == ""stop"" goto doStop step8.3)如果第1個參數不正確,或沒有使用參數,則該批處理文件會退出; echo Usage: catalina ( commands ... ) echo commands: echo debug Start Catalina in a debugger echo debug -security Debug Catalina with a security manager echo embedded Start Catalina in embedded mode echo jpda start Start Catalina under JPDA debugger echo run Start Catalina in the current window echo run -security Start in the current window with security manager echo start Start Catalina in a separate window echo start -security Start in a separate window with security manager echo stop Stop Catalina goto end step9)如果參數是start,則跳轉到 doStart標簽后,catalina.bat(它)會調用 shift命令來檢查下一個參數;如果有第2個參數的話,那么它必須是 -security;否則,忽略它;如果下一個參數是 -security,會再次調用 shift命令,變量 SECURITY_POLICY_FILE 會被設置成為 %CATALINA_BASE%\conf\catalina.policy;(干貨——如果運行catalina.bat 批處理文件的參數是start) :doStart shift if not "%OS%" == "Windows_NT" goto noTitle set _EXECJAVA=start "Tomcat" %_RUNJAVA% goto gotTitle :noTitle set _EXECJAVA=start %_RUNJAVA% :gotTitle if not ""%1"" == ""-security"" goto execCmd shift echo Using Security Manager set SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy step9.1)跳轉到 execCmd標簽處: goto execCmd step9.2)execCmd標簽下的 命令接收剩余未移動的命令行參數,將它們保存到 變量 CMD_LINE_ARGS 中,再跳轉到 doneSetArgs 標簽處: :execCmd rem Get remaining unshifted command line arguments and save them in the set CMD_LINE_ARGS= :setArgs if ""%1""=="""" goto doneSetArgs set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 shift goto setArgs step9.3)下面是?doneSetArgs 標簽處的代碼 :doneSetArgs rem Execute Java with the applicable properties if not "%JPDA%" == "" goto doJpda if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION% goto end 對以上代碼的分析(Analysis):?例如在pc上,調用catalina.bat 文件,上面的代碼 會被轉換為下面的實際代碼:(從 %_EXECJAVA% 到 %ACTION%) start "Tomcat" "C:\jdk1.8.0_60\bin\java" -Djava.endorsed.dirs="..\common\endorsed" -classpath "C:\jdk1.8.0_60\lib\tools.jar;..\lib\bootstrap.jar" -Dcatalina.base=".." Dcatalina.home=".." -Djava.io.tmpdir="..\temp" org.apache.catalina.startup.Bootstrap start
2)分析 startup.bat 批處理文件的內容:(其他startup.bat 是調用了 catalina.bat 文件)startup.bat
2.1)鑒于startup.bat 的 內容與 catlina.bat 文件的內容相似度較大,不不做分析,僅給出其源碼;
@echo offrem Licensed to the Apache Software Foundation (ASF) under one or more rem contributor license agreements. See the NOTICE file distributed with rem this work for additional information regarding copyright ownership. rem The ASF licenses this file to You under the Apache License, Version 2.0 rem (the "License"); you may not use this file except in compliance with rem the License. You may obtain a copy of the License at rem rem http://www.apache.org/licenses/LICENSE-2.0 rem rem Unless required by applicable law or agreed to in writing, software rem distributed under the License is distributed on an "AS IS" BASIS, rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. rem See the License for the specific language governing permissions and rem limitations under the License.if "%OS%" == "Windows_NT" setlocal rem --------------------------------------------------------------------------- rem Start script for the CATALINA Server rem rem $Id: startup.bat 743401 2009-02-11 17:01:58Z markt $ rem ---------------------------------------------------------------------------rem Guess CATALINA_HOME if not defined if not "%CATALINA_HOME%" == "" goto gotHome set CATALINA_HOME=. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome set CATALINA_HOME=.. :gotHome 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 :okHomeset EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat // 設置 catalina.bat 到 EXECUTABLE.rem Check that target executable exists if exist "%EXECUTABLE%" goto okExec echo Cannot find %EXECUTABLE% echo This file is needed to run this program goto end :okExecrem Get remaining unshifted command line arguments and save them in the set CMD_LINE_ARGS= :setArgs if ""%1""=="""" goto doneSetArgs set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1 shift goto setArgs :doneSetArgscall "%EXECUTABLE%" start %CMD_LINE_ARGS% // highlight line.:end
總結
以上是生活随笔為你收集整理的tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php来自页面的消息 怎么(php来自页
- 下一篇: windows查找端口占用并杀死端口进程