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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)

發(fā)布時(shí)間:2023/12/3 windows 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
【0】README 1)本文部分文字描述轉(zhuǎn)自:“深入剖析tomcat”,旨在學(xué)習(xí)“tomcat啟動腳本分析”?的相關(guān)知識; 2)for tomcat4 startup files, please visit?https://github.com/pacosonTang/HowTomcatWorks/tree/master/supplement/tomcat4_bin
【1】Windows平臺的啟動腳本 1)分析catalina.bat 批處理文件的內(nèi)容:(catalina.bat) step1)首先使用 @echo off 命令隱藏命令的顯示; step2)然后檢查環(huán)境變量OS的值是否為 “Windows_NT”;即用戶使用的是否是 window os 的相應(yīng)distribution;如果是,它就調(diào)用 setLocal 命令將對環(huán)境變量的修改控制在當(dāng)前批處理文件中:if "%OS%" == "Windows_NT" setlocal step3)然后,如果先前沒有設(shè)置變量 CATALINA_HOME 的值,就在這里進(jìn)行設(shè)置。默認(rèn)case下,變量 CATALINE_HOME 是不存在的;如果顯然沒有設(shè)置過變量 CATALINA_HOME,那么批處理文件會猜測是從哪個(gè)文件目錄進(jìn)行調(diào)用;(干貨——設(shè)置 環(huán)境變量CATALINA_HOME的值,該值應(yīng)該被正確設(shè)置為bin的父目錄) step3.1)首先,它會假設(shè)catalina.bat 文件是在安裝目錄中進(jìn)行調(diào)用的。那么在bin目錄下就一定存在一個(gè) catalina.bat 的文件: if not "%CATALINA_HOME%" == "" goto gotHome set CATALINA_HOME=. if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome step3.2)如果在當(dāng)前目錄的子目錄bin下沒有找到catalina.bat 文件;批處理文件會再猜測一次;這次,它還會假設(shè)catalina.bat 文件是在安裝目錄的bin 命令下調(diào)用的,但是會將變量 CATALINA_HOME 設(shè)置為當(dāng)前目錄的父目錄,并檢查 catalina.bat 是否存在于 bin目錄中; set CATALINA_HOME=.. :gotHome if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome step3.3)如果這次猜測正確,就跳轉(zhuǎn)到 okHome標(biāo)簽所在位置繼續(xù)運(yùn)行;否則,它輸出錯(cuò)誤消息,告訴用戶變量 CATALINA_HOME 設(shè)置錯(cuò)誤,并跳轉(zhuǎn)到end標(biāo)簽所在位置。end標(biāo)簽在批處理文件的末尾,會退出腳本執(zhí)行; 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 設(shè)置正確,并且setenv.bat 文件存在的話,會調(diào)用 setenv.bat 批處理腳本來設(shè)置需要的環(huán)境變量。如果 setenv.bat 文件不存在,就輸出錯(cuò)誤消息;(干貨——查看setenv.bat是否存在,存在的話就調(diào)用該文件設(shè)置環(huán)境變量) rem Get standard environment variables if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat" step4)接下來,它檢查 setclasspath.bat 是否存在?如果不存在,它輸出一條錯(cuò)誤消息,并跳轉(zhuǎn)到end標(biāo)簽所在的位置,退出批處理文件;(干貨——查看 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,并賦值為環(huán)境變量 CATALINA_HOME 的值,然后,調(diào)用 setclasspath.bat 批處理文件設(shè)置類路徑: :okSetclasspath set BASEDIR=%CATALINA_HOME% call "%CATALINA_HOME%\bin\setclasspath.bat" step4.2)setclasspath.bat 文件會檢查環(huán)境變量 JAVA_HOME 是否設(shè)置正確,并設(shè)置將會在 catalina.bat 批處理文件中所要用到的變量:(干貨——調(diào)用setclasspath.bat 設(shè)置類路徑 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),以及環(huán)境變量 JSSE_home 是否設(shè)置正確。如果存在環(huán)境變量 JSSE_HOME,將其添加到環(huán)境變量CLASSPATH中:(干貨——檢查JSSE_home?環(huán)境變量是否設(shè)置 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)如果沒有設(shè)置環(huán)境變量 JSSE_HOME,批處理文件會繼續(xù)執(zhí)行下面的目錄,將bin目錄下的 bootstrap.jar 添加到 環(huán)境變量 CLASSPATH 中; set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\bootstrap.jar step6)接下來,檢查環(huán)境變量 CATALINA_BASE 是否設(shè)置,若沒有設(shè)置則將 CATALINE_HOME的值賦給它;(干貨——檢查CATALINA_BASE?環(huán)境變量是否設(shè)置 if not "%CATALINA_BASE%" == "" goto gotBase set CATALINA_BASE=%CATALINA_HOME% :gotBase step6.1)接著會檢查變量 %CATALINA_TMPDIR% 是否設(shè)置,若沒有設(shè)置的話,將其設(shè)置為 CATALINE_BASE 下的臨時(shí)目錄; 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 中設(shè)置的變量 _RUNJAVA 的值賦給 _EXECJAVA。(干貨——為一些環(huán)境變量賦值) set _EXECJAVA=%_RUNJAVA% step7.1)它再設(shè)置如下的環(huán)境變量: set MAINCLASS=org.apache.catalina.startup.Bootstrap // 設(shè)置啟動目錄; 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個(gè)參數(shù)是否是 jpda(java platform debugger architecture);(干貨——判斷傳入的第1個(gè)參數(shù)是否是 jpda) step8.1)如果是:就設(shè)置變量 JPDA的值為 jpda,然后檢查變量 JPDA_TRANSPORT 和 變量 JPDA_ADDRESS的值,并移動參數(shù): 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)大多數(shù)case下,不需要使用 JPDA,因此,第1個(gè)參數(shù)的值必須是以下幾個(gè)中的一個(gè): 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個(gè)參數(shù)不正確,或沒有使用參數(shù),則該批處理文件會退出; 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)如果參數(shù)是start,則跳轉(zhuǎn)到 doStart標(biāo)簽后,catalina.bat(它)會調(diào)用 shift命令來檢查下一個(gè)參數(shù);如果有第2個(gè)參數(shù)的話,那么它必須是 -security;否則,忽略它;如果下一個(gè)參數(shù)是 -security,會再次調(diào)用 shift命令,變量 SECURITY_POLICY_FILE 會被設(shè)置成為 %CATALINA_BASE%\conf\catalina.policy;(干貨——如果運(yùn)行catalina.bat 批處理文件的參數(shù)是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)跳轉(zhuǎn)到 execCmd標(biāo)簽處: goto execCmd step9.2)execCmd標(biāo)簽下的 命令接收剩余未移動的命令行參數(shù),將它們保存到 變量 CMD_LINE_ARGS 中,再跳轉(zhuǎn)到 doneSetArgs 標(biāo)簽處: :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 標(biāo)簽處的代碼 :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上,調(diào)用catalina.bat 文件,上面的代碼 會被轉(zhuǎn)換為下面的實(shí)際代碼:(從 %_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 批處理文件的內(nèi)容:(其他startup.bat 是調(diào)用了 catalina.bat 文件)startup.bat

2.1)鑒于startup.bat 的 內(nèi)容與 catlina.bat 文件的內(nèi)容相似度較大,不不做分析,僅給出其源碼;

@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 // 設(shè)置 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

總結(jié)

以上是生活随笔為你收集整理的tomcatSupplement(1)tomcat启动脚本分析(以Windows平台为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。