tomcat研究

来源:互联网 发布:to:day软件 编辑:程序博客网 时间:2024/05/21 06:50
 

tomcat启动(一)

分类: tomcat调试 1085人阅读 评论(0) 收藏 举报

tomcat启动命令

安装tomcat之后,设置CATALINA_HOME=tomcat的安装目录,比如安装在c:/tomcat,那么CATALINA_HOME=c:/tomcat,添加路径到path环境变量,%CATALINA_HOME%/bin,然后打开控制台,进入tomcat的bin目录,这儿有tomcat的启动脚本,startup.bat启动tomcat,shutdown.bat关闭tomcat。我是在windows下做的调试,如果在linux/unix下,相应的启动脚本为startup.sh和shutdown.sh。

tomcat启动脚本解说

用文本编辑器打开startup.bat,你会看到如下,内容: 

[html] view plaincopy
  1. @echo off  
  2.   
  3. if "%OS%" == "Windows_NT" setlocal  
  4.   
  5. rem ---------------------------------------------------------------------------  
  6.   
  7. rem Start script for the CATALINA Server  
  8.   
  9. rem  
  10.   
  11. rem $Id: startup.bat,v 1.6 2004/05/27 18:25:11 yoavs Exp $  
  12.   
  13. rem ---------------------------------------------------------------------------  
  14.   
  15.   
  16.   
  17. rem Guess CATALINA_HOME if not defined  
  18.   
  19. set CURRENT_DIR=%cd%  
  20.   
  21. if not "%CATALINA_HOME%" == "" goto gotHome  
  22.   
  23. set CATALINA_HOME=%CURRENT_DIR%  
  24.   
  25. if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome  
  26.   
  27. cd ..  
  28.   
  29. set CATALINA_HOME=%cd%  
  30.   
  31. cd %CURRENT_DIR%  
  32.   
  33. :gotHome  
  34.   
  35. if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome  
  36.   
  37. echo The CATALINA_HOME environment variable is not defined correctly  
  38.   
  39. echo This environment variable is needed to run this program  
  40.   
  41. goto end  
  42.   
  43. :okHome  
  44.   
  45.   
  46.   
  47. set EXECUTABLE=%CATALINA_HOME%/bin/catalina.bat  
  48.   
  49.   
  50.   
  51. rem Check that target executable exists  
  52.   
  53. if exist "%EXECUTABLE%" goto okExec  
  54.   
  55. echo Cannot find %EXECUTABLE%  
  56.   
  57. echo This file is needed to run this program  
  58.   
  59. goto end  
  60.   
  61. :okExec  
  62.   
  63.   
  64.   
  65. rem Get remaining unshifted command line arguments and save them in the  
  66.   
  67. set CMD_LINE_ARGS=  
  68.   
  69. :setArgs  
  70.   
  71. if ""%1""=="""" goto doneSetArgs  
  72.   
  73. set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1  
  74.   
  75. shift  
  76.   
  77. goto setArgs  
  78.   
  79. :doneSetArgs  
  80.   
  81.   
  82.   
  83. call "%EXECUTABLE%" start %CMD_LINE_ARGS%  
  84.   
  85.   
  86.   
  87. :end  

 

 第一段,内容如下,先设置好变量CATALINA_HOME,然后判断是否存在脚本文件"%CATALINA_HOME%/bin/catalina.bat",如果找不到该文件,那么退出脚本的执行,提示设置CATALINA_HOME环境变量,这就是我们在安装tomcat后,要设置环境变量CATALINA_HOME的原因。

 

[csharp] view plaincopy
  1. @echo off  
  2.   
  3. if "%OS%" == "Windows_NT" setlocal  
  4.   
  5. rem ---------------------------------------------------------------------------  
  6.   
  7. rem Start script for the CATALINA Server  
  8.   
  9. rem  
  10.   
  11. rem $Id: startup.bat,v 1.6 2004/05/27 18:25:11 yoavs Exp $  
  12.   
  13. rem ---------------------------------------------------------------------------  
  14.   
  15.   
  16.   
  17. rem Guess CATALINA_HOME if not defined  
  18.   
  19. set CURRENT_DIR=%cd%  
  20.   
  21. if not "%CATALINA_HOME%" == "" goto gotHome  
  22.   
  23. set CATALINA_HOME=%CURRENT_DIR%  
  24.   
  25. if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome  
  26.   
  27. cd ..  
  28.   
  29. set CATALINA_HOME=%cd%  
  30.   
  31. cd %CURRENT_DIR%  
  32.   
  33. :gotHome  
  34.   
  35. if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome  
  36.   
  37. echo The CATALINA_HOME environment variable is not defined correctly  
  38.   
  39. echo This environment variable is needed to run this program  
  40.   
  41. goto end  
  42.   
  43. :okHome  
  44.   
  45.   
  46.   
  47. set EXECUTABLE=%CATALINA_HOME%/bin/catalina.bat  
[csharp] view plaincopy
  1.   

第二段,内容如下,用EXECUTABLE脚本指向的脚本文件,执行启动命令,传入参数start,既进入启动脚本catalina.bat的执行。

[html] view plaincopy
  1. rem Check that target executable exists  
  2.   
  3. if exist "%EXECUTABLE%" goto okExec  
  4.   
  5. echo Cannot find %EXECUTABLE%  
  6.   
  7. echo This file is needed to run this program  
  8.   
  9. goto end  
  10.   
  11. :okExec  
  12.   
  13.   
  14.   
  15. rem Get remaining unshifted command line arguments and save them in the  
  16.   
  17. set CMD_LINE_ARGS=  
  18.   
  19. :setArgs  
  20.   
  21. if ""%1""=="""" goto doneSetArgs  
  22.   
  23. set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1  
  24.   
  25. shift  
  26.   
  27. goto setArgs  
  28.   
  29. :doneSetArgs  
  30.   
  31.   
  32.   
  33. call "%EXECUTABLE%" start %CMD_LINE_ARGS%  
  34.   
  35.   
  36.   
  37. :end  

catalina.bat内容如下:

[html] view plaincopy
  1. @echo off  
  2.   
  3. if "%OS%" == "Windows_NT" setlocal  
  4.   
  5. rem ---------------------------------------------------------------------------  
  6.   
  7. rem Start/Stop Script for the CATALINA Server  
  8.   
  9. rem  
  10.   
  11. rem Environment Variable Prequisites  
  12.   
  13. rem  
  14.   
  15. rem   CATALINA_HOME   May point at your Catalina "build" directory.  
  16.   
  17. rem  
  18.   
  19. rem   CATALINA_BASE   (Optional) Base directory for resolving dynamic portions  
  20.   
  21. rem                   of a Catalina installation.  If not present, resolves to  
  22.   
  23. rem                   the same directory that CATALINA_HOME points to.  
  24.   
  25. rem  
  26.   
  27. rem   CATALINA_OPTS   (Optional) Java runtime options used when the "start",  
  28.   
  29. rem                   "stop", or "run" command is executed.  
  30.   
  31. rem  
  32.   
  33. rem   CATALINA_TMPDIR (Optional) Directory path location of temporary directory  
  34.   
  35. rem                   the JVM should use (java.io.tmpdir).  Defaults to  
  36.   
  37. rem                   %CATALINA_BASE%/temp.  
  38.   
  39. rem  
  40.   
  41. rem   JAVA_HOME       Must point at your Java Development Kit installation.  
  42.   
  43. rem  
  44.   
  45. rem   JAVA_OPTS       (Optional) Java runtime options used when the "start",  
  46.   
  47. rem                   "stop", or "run" command is executed.  
  48.   
  49. rem  
  50.   
  51. rem   JSSE_HOME       (Optional) May point at your Java Secure Sockets Extension  
  52.   
  53. rem                   (JSSE) installation, whose JAR files will be added to the  
  54.   
  55. rem                   system class path used to start Tomcat.  
  56.   
  57. rem  
  58.   
  59. rem   JPDA_TRANSPORT  (Optional) JPDA transport used when the "jpda start"  
  60.   
  61. rem                   command is executed. The default is "dt_shmem".  
  62.   
  63. rem  
  64.   
  65. rem   JPDA_ADDRESS    (Optional) Java runtime options used when the "jpda start"  
  66.   
  67. rem                   command is executed. The default is "jdbconn".  
  68.   
  69. rem  
  70.   
  71. rem $Id: catalina.bat,v 1.9.2.2 2004/09/23 20:17:14 yoavs Exp $  
  72.   
  73. rem ---------------------------------------------------------------------------  
  74.   
  75.   
  76.   
  77. rem Guess CATALINA_HOME if not defined  
  78.   
  79. set CURRENT_DIR=%cd%  
  80.   
  81. if not "%CATALINA_HOME%" == "" goto gotHome  
  82.   
  83. set CATALINA_HOME=%CURRENT_DIR%  
  84.   
  85. if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome  
  86.   
  87. cd ..  
  88.   
  89. set CATALINA_HOME=%cd%  
  90.   
  91. cd %CURRENT_DIR%  
  92.   
  93. :gotHome  
  94.   
  95. if exist "%CATALINA_HOME%/bin/catalina.bat" goto okHome  
  96.   
  97. echo The CATALINA_HOME environment variable is not defined correctly  
  98.   
  99. echo This environment variable is needed to run this program  
  100.   
  101. goto end  
  102.   
  103. :okHome  
  104.   
  105.   
  106.   
  107. rem Get standard environment variables  
  108.   
  109. if exist "%CATALINA_HOME%/bin/setenv.bat" call "%CATALINA_HOME%/bin/setenv.bat"  
  110.   
  111.   
  112.   
  113. rem Get standard Java environment variables  
  114.   
  115. if exist "%CATALINA_HOME%/bin/setclasspath.bat" goto okSetclasspath  
  116.   
  117. echo Cannot find %CATALINA_HOME%/bin/setclasspath.bat  
  118.   
  119. echo This file is needed to run this program  
  120.   
  121. goto end  
  122.   
  123. :okSetclasspath  
  124.   
  125. set BASEDIR=%CATALINA_HOME%  
  126.   
  127. call "%CATALINA_HOME%/bin/setclasspath.bat"  
  128.   
  129.   
  130.   
  131. rem Add on extra jar files to CLASSPATH  
  132.   
  133. if "%JSSE_HOME%" == "" goto noJsse  
  134.   
  135. set CLASSPATH=%CLASSPATH%;%JSSE_HOME%/lib/jcert.jar;%JSSE_HOME%/lib/jnet.jar;%JSSE_HOME%/lib/jsse.jar  
  136.   
  137. :noJsse  
  138.   
  139. set CLASSPATH=%CLASSPATH%;%CATALINA_HOME%/bin/bootstrap.jar  
  140.   
  141.   
  142.   
  143. if not "%CATALINA_BASE%" == "" goto gotBase  
  144.   
  145. set CATALINA_BASE=%CATALINA_HOME%  
  146.   
  147. :gotBase  
  148.   
  149.   
  150.   
  151. if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir  
  152.   
  153. set CATALINA_TMPDIR=%CATALINA_BASE%/temp  
  154.   
  155. :gotTmpdir  
  156.   
  157.   
  158.   
  159. rem ----- Execute The Requested Command ---------------------------------------  
  160.   
  161.   
  162.   
  163. echo Using CATALINA_BASE:   %CATALINA_BASE%  
  164.   
  165. echo Using CATALINA_HOME:   %CATALINA_HOME%  
  166.   
  167. echo Using CATALINA_TMPDIR: %CATALINA_TMPDIR%  
  168.   
  169. echo Using JAVA_HOME:       %JAVA_HOME%  
  170.   
  171.   
  172.   
  173. set _EXECJAVA=%_RUNJAVA%  
  174.   
  175. set MAINCLASS=org.apache.catalina.startup.Bootstrap  
  176.   
  177. set ACTION=start  
  178.   
  179. set SECURITY_POLICY_FILE=  
  180.   
  181. set DEBUG_OPTS=  
  182.   
  183. set JPDA=  
  184.   
  185.   
  186.   
  187. if not ""%1"" == ""jpda"" goto noJpda  
  188.   
  189. set JPDA=jpda  
  190.   
  191. if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport  
  192.   
  193. set JPDA_TRANSPORT=dt_shmem  
  194.   
  195. :gotJpdaTransport  
  196.   
  197. if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress  
  198.   
  199. set JPDA_ADDRESS=jdbconn  
  200.   
  201. :gotJpdaAddress  
  202.   
  203. shift  
  204.   
  205. :noJpda  
  206.   
  207.   
  208.   
  209. if ""%1"" == ""debug"" goto doDebug  
  210.   
  211. if ""%1"" == ""run"" goto doRun  
  212.   
  213. if ""%1"" == ""start"" goto doStart  
  214.   
  215. if ""%1"" == ""stop"" goto doStop  
  216.   
  217. if ""%1"" == ""version"" goto doVersion  
  218.   
  219.   
  220.   
  221. echo Usage:  catalina ( commands ... )  
  222.   
  223. echo commands:  
  224.   
  225. echo   debug             Start Catalina in a debugger  
  226.   
  227. echo   debug -security   Debug Catalina with a security manager  
  228.   
  229. echo   jpda start        Start Catalina under JPDA debugger  
  230.   
  231. echo   run               Start Catalina in the current window  
  232.   
  233. echo   run -security     Start in the current window with security manager  
  234.   
  235. echo   start             Start Catalina in a separate window  
  236.   
  237. echo   start -security   Start in a separate window with security manager  
  238.   
  239. echo   stop              Stop Catalina  
  240.   
  241. echo   version           What version of tomcat are you running?  
  242.   
  243. goto end  
  244.   
  245.   
  246.   
  247. :doDebug  
  248.   
  249. shift  
  250.   
  251. set _EXECJAVA=%_RUNJDB%  
  252.   
  253. set DEBUG_OPTS=-sourcepath "%CATALINA_HOME%/../../jakarta-tomcat-catalina/catalina/src/share"  
  254.   
  255. if not ""%1"" == ""-security"" goto execCmd  
  256.   
  257. shift  
  258.   
  259. echo Using Security Manager  
  260.   
  261. set SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy  
  262.   
  263. goto execCmd  
  264.   
  265.   
  266.   
  267. :doRun  
  268.   
  269. shift  
  270.   
  271. if not ""%1"" == ""-security"" goto execCmd  
  272.   
  273. shift  
  274.   
  275. echo Using Security Manager  
  276.   
  277. set SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy  
  278.   
  279. goto execCmd  
  280.   
  281.   
  282.   
  283. :doStart  
  284.   
  285. shift  
  286.   
  287. if not "%OS%" == "Windows_NT" goto noTitle  
  288.   
  289. set _EXECJAVA=start "Tomcat" %_RUNJAVA%  
  290.   
  291. goto gotTitle  
  292.   
  293. :noTitle  
  294.   
  295. set _EXECJAVA=start %_RUNJAVA%  
  296.   
  297. :gotTitle  
  298.   
  299. if not ""%1"" == ""-security"" goto execCmd  
  300.   
  301. shift  
  302.   
  303. echo Using Security Manager  
  304.   
  305. set SECURITY_POLICY_FILE=%CATALINA_BASE%/conf/catalina.policy  
  306.   
  307. goto execCmd  
  308.   
  309.   
  310.   
  311. :doStop  
  312.   
  313. shift  
  314.   
  315. set ACTION=stop  
  316.   
  317. goto execCmd  
  318.   
  319.   
  320.   
  321. :doVersion  
  322.   
  323. %_EXECJAVA% -classpath "%CATALINA_HOME%/server/lib/catalina.jar" org.apache.catalina.util.ServerInfo  
  324.   
  325. goto end  
  326.   
  327.   
  328.   
  329.   
  330.   
  331. :execCmd  
  332.   
  333. rem Get remaining unshifted command line arguments and save them in the  
  334.   
  335. set CMD_LINE_ARGS=  
  336.   
  337. :setArgs  
  338.   
  339. if ""%1""=="""" goto doneSetArgs  
  340.   
  341. set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1  
  342.   
  343. shift  
  344.   
  345. goto setArgs  
  346.   
  347. :doneSetArgs  
  348.   
  349.   
  350.   
  351. rem Execute Java with the applicable properties  
  352.   
  353. if not "%JPDA%" == "" goto doJpda  
  354.   
  355. if not "%SECURITY_POLICY_FILE%" == "" goto doSecurity  
  356.   
  357. %_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%  
  358.   
  359. goto end  
  360.   
  361. :doSecurity  
  362.   
  363. %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%  
  364.   
  365. goto end  
  366.   
  367. :doJpda  
  368.   
  369. if not "%SECURITY_POLICY_FILE%" == "" goto doSecurityJpda  
  370.   
  371. %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %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%  
  372.   
  373. goto end  
  374.   
  375. :doSecurityJpda  
  376.   
  377. %_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% -Xdebug -Xrunjdwp:transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=n %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Djava.security.manager -Djava.security.policy=="%SECURITY_POLICY_FILE%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%  
  378.   
  379. goto end  
  380.   
  381.   
  382.   
  383. :end  
解释,1。再次验证catalina.bat;2。调用setclasspath.bat设置java虚拟机相关的环境变量,所以在运行tomcat的前,一定要先安装jdk,并设置好JAVA_HOME环境变量;3。设置启动程序,添加CLASSPATH,bootstrap.jar,和启动类org.apache.catalina.startup.Bootstrap;4。最后执行虚拟机,运行tomcat。

运行tomcat的参数行为%_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%,在我的电脑上调试,将所有的变量内容转译出来,执行的命令即为:start "Tomcat" "C:/j2sdk1.4.2_15/bin/java"    -Djava.endorsed.dirs="C:/Tomcat 5.0/common/endorsed" -classpath "C:/j2sdk1.4.2_15/lib/tools.jar;C:/Tomcat 5.0/bin/bootstrap.jar" -Dcatalina.base="C:/Tomcat 5.0" -Dcatalina.home="C:/Tomcat 5.0" -Djava.io.tmpdir="C:/Tomcat 5.0/temp" org.apache.catalina.startup.Bootstrap  start

在该命令中,start "Tomcat"是在控制态打开一个新的窗口,然后运行java虚拟机C:/j2sdk1.4.2_15/bin/java,现在大家应该明白了,tomcat是从bootstrap.jar中的org.apache.catalina.startup.Bootstrap类的main函数开始启动运行,并且传入了start参数。-D开始的都是虚拟机的运行参数。

用winrar打开bootstrap.jar打开,在META-INF目录下打开MANIFEST.MF,你会看到如下内容: Manifest-Version: 1.0 Ant-Version: Apache Ant 1.6.1 Created-By: 1.4.2-b28 (Sun Microsystems Inc.) Main-Class: org.apache.catalina.startup.Bootstrap Specification-Title: Catalina Specification-Version: 1.0 Class-Path: jmx.jar commons-daemon.jar commons-logging-api.jar 指定了该jar包从那个类开始运行,依赖那些jar包。

结论

 通过对脚本的研究,我们应该知道,tomcat从那儿开始运行,只有有了运行的线索,那么我们就可以从头开始调试tomcat源代码。调试tomcat源代码的准备工作,从www.apache.org上下载相应版本,带源代码的安装程序,并安装。



 

建立tomcat调试环境(二)

分类: tomcat调试 342人阅读 评论(0) 收藏 举报

1。准备工作

下载tomcat,我下载的是tomcat5.0.30,我认为这是一个比较好的版本。下载地址http://archive.apache.org/dist/tomcat/tomcat-5/v5.0.30/bin/,选择window下载安装文件。

安装的时候,选择安装源代码选项,如下图。我的tomcat安装目录是C:/Tomcat 5.0

安装myeclipse,我安装的是5.5版。

2。创建工程

tomcat的整个安装目录拷贝到myeclipse的workspace目录下,如下图: 

然后创建一个名为Tomcat 5.0的java project,如下步骤。

第一步,选择创建project,如下图: 

第二步,选择java project: 

第三步,选择和tomcat拷贝目录同名的project,如下图,选择“Finish”按钮。 

这时候,你已经创建了tomcat的调试环境。

你可能会看到一些红色编译错误,你还需要下载mail.jar,activation.jar两个库文件,添加到工程中。

工程中估计还有一些编译错误,大家可以自己修改代码来解决,应该很简单。

3。开始调试

打开文件Bootstrap.java,所在的包为package org.apache.catalina.startup,如下图:

这就是tomcat的启动文件(大家可以通过文件搜索来找到该文件所在路径),找到main方法,tomcat就从这个main方法的地方开始运行启动,你现在可以设置断点,开始运行。

由于时间的原因,我都写的比较检阅,如果对myeclipse和tomcat有一定了解的朋友,肯定能很快建立环境。


 

tomcat启动main函数(三)

分类: tomcat调试 502人阅读 评论(0) 收藏 举报

有了上面的准备工作,我们开始源代码调试。

main函数说明

开打Bootstrap.java,找到main函数,函数源代码如下:

[java] view plaincopy
  1. public static void main(String args[]) {  
  2.   
  3.   
  4.   
  5.     try {  
  6.   
  7.         // Attempt to load JMX class  
  8.   
  9.         new ObjectName("test:foo=bar");  
  10.   
  11.     } catch (Throwable t) {  
  12.   
  13.         System.out.println(JMX_ERROR_MESSAGE);  
  14.   
  15.         try {  
  16.   
  17.             // Give users some time to read the message before exiting  
  18.   
  19.             Thread.sleep(5000);  
  20.   
  21.         } catch (Exception ex) {  
  22.   
  23.         }  
  24.   
  25.         return;  
  26.   
  27.     }  
  28.   
  29.   
  30.   
  31.     if (daemon == null) {  
  32.   
  33.         daemon = new Bootstrap();  
  34.   
  35.         try {  
  36.   
  37.             daemon.init();  
  38.   
  39.         } catch (Throwable t) {  
  40.   
  41.             t.printStackTrace();  
  42.   
  43.             return;  
  44.   
  45.         }  
  46.   
  47.     }  
  48.   
  49.   
  50.   
  51.     try {  
  52.   
  53.         String command = "start";  
  54.   
  55.         if (args.length > 0) {  
  56.   
  57.             command = args[args.length - 1];  
  58.   
  59.         }  
  60.   
  61.   
  62.   
  63.         if (command.equals("startd")) {  
  64.   
  65.             args[0] = "start";  
  66.   
  67.             daemon.load(args);  
  68.   
  69.             daemon.start();  
  70.   
  71.         } else if (command.equals("stopd")) {  
  72.   
  73.             args[0] = "stop";  
  74.   
  75.             daemon.stop();  
  76.   
  77.         } else if (command.equals("start")) {  
  78.   
  79.             daemon.setAwait(true);  
  80.   
  81.             daemon.load(args);  
  82.   
  83.             daemon.start();  
  84.   
  85.         } else if (command.equals("stop")) {  
  86.   
  87.             daemon.stopServer(args);  
  88.   
  89.         }  
  90.   
  91.     } catch (Throwable t) {  
  92.   
  93.         t.printStackTrace();  
  94.   
  95.     }  
  96.   
  97. }  

上面的代码一共分成三部分: 第一部分:

[java] view plaincopy
  1. try {  
  2.   
  3.     // Attempt to load JMX class  
  4.   
  5.     new ObjectName("test:foo=bar");  
  6.   
  7. catch (Throwable t) {  
  8.   
  9.     System.out.println(JMX_ERROR_MESSAGE);  
  10.   
  11.     try {  
  12.   
  13.         // Give users some time to read the message before exiting  
  14.   
  15.         Thread.sleep(5000);  
  16.   
  17.     } catch (Exception ex) {  
  18.   
  19.     }  
  20.   
  21.     return;  
  22.   
  23. }  

验证jdk基础类是否载入,没有载入,在标准输入打印错误信息,然后退出程序运行。

 

第二部分:

[java] view plaincopy
  1. if (daemon == null) {  
  2.   
  3.     daemon = new Bootstrap();  
  4.   
  5.     try {  
  6.   
  7.         daemon.init();  
  8.   
  9.     } catch (Throwable t) {  
  10.   
  11.         t.printStackTrace();  
  12.   
  13.         return;  
  14.   
  15.     }  
  16.   
  17. }  

初始化运行环境,载入需要的jar包,读取conf/server.xml,生成相应的运行对象:

 

第三部分:

[java] view plaincopy
  1. try {  
  2.   
  3.     String command = "start";  
  4.   
  5.     if (args.length > 0) {  
  6.   
  7.         command = args[args.length - 1];  
  8.   
  9.     }  
  10.   
  11.   
  12.   
  13.     if (command.equals("startd")) {  
  14.   
  15.         args[0] = "start";  
  16.   
  17.         daemon.load(args);  
  18.   
  19.         daemon.start();  
  20.   
  21.     } else if (command.equals("stopd")) {  
  22.   
  23.         args[0] = "stop";  
  24.   
  25.         daemon.stop();  
  26.   
  27.     } else if (command.equals("start")) {  
  28.   
  29.         daemon.setAwait(true);  
  30.   
  31.         daemon.load(args);  
  32.   
  33.         daemon.start();  
  34.   
  35.     } else if (command.equals("stop")) {  
  36.   
  37.         daemon.stopServer(args);  
  38.   
  39.     }  
  40.   
  41. catch (Throwable t) {  
  42.   
  43.     t.printStackTrace();  
  44.   
  45. }  

装载,开始运行。



 

jar运行库载入(四)

分类: tomcat调试 198人阅读 评论(0) 收藏 举报

前面讲述了main函数三段的主要任务,第一段基本库验证没什么好说的了。下面我们开始第二段的调试。

[java] view plaincopy
  1. if (daemon == null) {  
  2.   
  3.     daemon = new Bootstrap();  
  4.   
  5.     try {  
  6.   
  7.         daemon.init();  
  8.   
  9.     } catch (Throwable t) {  
  10.   
  11.         t.printStackTrace();  
  12.   
  13.         return;  
  14.   
  15.     }  
  16.   
  17. }  

从上面我们可以看得出,首先,创建了一个Bootstrap对象,然后进入该对象的额init方法,进行初始化处理。下面我们看看init方法的内容:

 

[java] view plaincopy
  1. public void init()  throws Exception  
  2.   
  3. {  
  4.   
  5.   // Set Catalina path  
  6.   
  7.   setCatalinaHome();  
  8.   
  9.   setCatalinaBase();  
  10.   
  11.   initClassLoaders();  
  12.   
  13.   Thread.currentThread().setContextClassLoader(catalinaLoader);  
  14.   
  15.   SecurityClassLoad.securityClassLoad(catalinaLoader);  
  16.   
  17.   // Load our startup class and call its process() method  
  18.   
  19.   if (debug >= 1)  
  20.   
  21.       log("Loading startup class");  
  22.   
  23.   Class startupClass =  
  24.   
  25.       catalinaLoader.loadClass  
  26.   
  27.       ("org.apache.catalina.startup.Catalina");  
  28.   
  29.   Object startupInstance = startupClass.newInstance();  
  30.   
  31.   // Set the shared extensions class loader  
  32.   
  33.   if (debug >= 1)  
  34.   
  35.       log("Setting startup class properties");  
  36.   
  37.   String methodName = "setParentClassLoader";  
  38.   
  39.   Class paramTypes[] = new Class[1];  
  40.   
  41.   paramTypes[0] = Class.forName("java.lang.ClassLoader");  
  42.   
  43.   Object paramValues[] = new Object[1];  
  44.   
  45.   paramValues[0] = sharedLoader;  
  46.   
  47.   Method method =  
  48.   
  49.       startupInstance.getClass().getMethod(methodName, paramTypes);  
  50.   
  51.   method.invoke(startupInstance, paramValues);  
  52.   
  53.   catalinaDaemon = startupInstance;  
  54.   
  55. }  

setCatalinaHome()设置catalina.home的环境变量;setCatalinaBase()设置catalina.base的环境变量,一般是等于catalina.home。initClassLoaders()载入tomcat安装目录下,子目录common/lib、server/lib、shared/lib下的jar运行时库文件,并创建对应的三个classloader:commonLoader、catalinaLoader、sharedLoader,并且commonLoader是catalinaLoader和sharedLoader的父节点。

然后创建一个org.apache.catalina.startup.Catalina类对象,调用setParentClassLoader方法,将commonLoader赋予自己的parentClassLoader成员。保存Catalina对象。这样tomcat运行的时候,需要用到的类都载入到运行环境中了。

在tomcat运行时库的载入过程中,涉及到一些关键的类,它们得关系图如下。

在方法createClassLoader中,根据传入的参数,从配置文件/org/apache/catalina/startup/catalina.properties中,根据配置参数,遍历制定的目录,得到所有的jar文件列表,将这些列表载入到制定classloader中,实现了一个classloader子类StandardClassLoader,最后用运行时库的jar作为参数,创建一个StandardClassLoader放回。

对应的时序图为

根据上面的两个图,大家对tomcat运行时库的载入,然后创建一个org.apache.catalina.startup.Catalina对象应该有了一个大体的了解,这个Catalina对象保存为Bootstrap类的成员catalinaDaemon,这个对象后面将大有用处。如果对classloader有不理解的,可以在网上搜索相关的资料,就很容易理解了。

运行时库载入就好像一个windows程序运行的时候,需要载入一些lib库那样。

载入的具体细节,大家可以浏览具体的代码。如果有感兴趣的朋友,给我留言,我们一起学习研究。



现在开始调试前提到的第三段代码

[java] view plaincopy
  1. try {  
  2.   
  3.     String command = "start";  
  4.   
  5.     if (args.length > 0) {  
  6.   
  7.         command = args[args.length - 1];  
  8.   
  9.     }  
  10.   
  11.   
  12.   
  13.     if (command.equals("startd")) {  
  14.   
  15.         args[0] = "start";  
  16.   
  17.         daemon.load(args);  
  18.   
  19.         daemon.start();  
  20.   
  21.     } else if (command.equals("stopd")) {  
  22.   
  23.         args[0] = "stop";  
  24.   
  25.         daemon.stop();  
  26.   
  27.     } else if (command.equals("start")) {  
  28.   
  29.         daemon.setAwait(true);  
  30.   
  31.         daemon.load(args);  
  32.   
  33.         daemon.start();  
  34.   
  35.     } else if (command.equals("stop")) {  
  36.   
  37.         daemon.stopServer(args);  
  38.   
  39.     }  
  40.   
  41. catch (Throwable t) {  
  42.   
  43.     t.printStackTrace();  
  44.   
  45. }  

看到上面的的代码,大家应该记得我们在阅读tomcat启动脚本startup.bat的时候,传入了start参数。由于我们是调试运行,参数数组args中没有内容,第一个if之后,command =start。所以最后将运行到如下一段代码:

[java] view plaincopy
  1. else if (command.equals("start")) {  
  2.   
  3.     daemon.setAwait(true);  
  4.   
  5.     daemon.load(args);  
  6.   
  7.     daemon.start();  
  8.   
  9. }  

设置等待参数为true;



原创粉丝点击