参考地址:https://blog.csdn.net/flyliuweisky547/article/details/22753383
一、结论
**执行startup.bat等同于catalina.bat start,而执行catalina.bat start等同于java Bootstrap start(附带-D、-classpath选项) Tomcat就是一个java程序**二、过程
2.1 前言
catalina.bat中涉及一个新的bat语法:替换变量中的某个字符
获取系统变量:%JAVA_HOME%
获取系统变量%JAVA_HOME%,将%JAVA_HOME%中的a替换成CSDN:%JAVA_HOME:a=CSDN%
创建Test.bat
@echo off
echo %JAVA_HOME%
echo %JAVA_HOME:a=CSDN%
catalina.bat中的%CATALINA_HOME:;=%,是将%CATALINA_HOME%的;删除
catalina.bat中通过"%CATALINA_HOME%" == “%CATALINA_HOME:;=%”,检查CATALINA_HOME中是否包含;
true-不包含;false-包含
2.2 catalina.bat分析
.bat 文件叫批处理文件,顾名思义,就是把一堆的dos命令写在一个文件中进行批量处理执行。
下面我们来看看catalina.bat(代码就不贴了。。。)
@echo off-从本条命令开始开始,关闭回显,如果不关闭的话.bat 中的所有命令都会在控制台上打印一遍
if “%OS%” == “Windows_NT” setlocal-判断是否为Windows系统。是,则执行setlocal
以下这部分代码是删除临时文件(如果存在的话)
if not “”%1"" == ““run”” goto mainEntry
if “%TEMP%” == “” goto mainEntry
if exist “%TEMP%%~nx0.run” goto mainEntry
echo Y>"%TEMP%%~nx0.run"
if not exist “%TEMP%%~nx0.run” goto mainEntry
echo Y>"%TEMP%%~nx0.Y"
call “%~f0” %* <"%TEMP%%~nx0.Y"
rem Use provided errorlevel
set RETVAL=%ERRORLEVEL%
del /Q “%TEMP%%~nx0.Y” >NUL 2>&1
exit /B %RETVAL%
:mainEntry
del /Q “%TEMP%%~nx0.run” >NUL 2>&1
————————————————
catalina.ba执行流程图
在这里插入代码片
在catalina.bat的:end下方加入一行代码
echo %_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" "D:\Program Files\Java\jdk1.7.0_17\bin\java" -Djava.util.logging.config.file="D:\apache-tomcat-7.0.40\conf\logging.properties" -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs="D:\apache-tomcat-7.0.40\endorsed" -classpath "D:\apache-tomcat-7.0.40\bin\bootstrap.jar;D:\apache-tomcat-7.0.40\bin\tomcat-juli.jar" -Dcatalina.base="D:\apache-tomcat-7.0.40" -Dcatalina.home="D:\apache-tomcat-7.0.40" -Djava.io.tmpdir="D:\apache-tomcat-7.0.40\temp" org.apache.catalina.startup.Bootstrap start
可以看出:
start “Tomcat” 表示打开一个新的dos窗口并且标题为Tomcat
2.3 通过java调用开启tomcat
拿到上一步打印的启动tomcat的java命令,放在以下测试程序总的cmdStartTomcat 这个变量上执行
package com.esint.boot.catalina;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* User: maruis
* Date: 2021/5/15 11:41
* Description:
*/
public class Test {
public static void main(String[] args) throws IOException {
String cmdStartTomcat = "start \"Tomcat-maruis-8080\" \"D:\\Program Files\\Java\\jdk1.7.0_17\\bin\\java\" -classpath \"D:\\apache-tomcat-7.0.40\\bin\\bootstrap.jar;D:\\apache-tomcat-7.0.40\\bin\\tomcat-juli.jar\" -Dcatalina.home=\"D:\\apache-tomcat-7.0.40\" org.apache.catalina.startup.Bootstrap start";
InputStream ins = null;
// 注意两面两个参数cmd.ex he /c 一定要写
String[] cmd = new String[] { "cmd.exe", "/C", cmdStartTomcat }; // 命令
Process process = null;
try {
process = Runtime.getRuntime().exec(cmd);
ins = process.getInputStream(); // 获取执行cmd命令后的信息
BufferedReader reader = new BufferedReader(new InputStreamReader(ins));
String line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line); // 输出
}
int exitValue = process.waitFor();
System.out.println("返回值:" + exitValue);
} catch (Exception e) {
e.printStackTrace();
}finally {
if(process!=null){
process.getOutputStream().close(); // 不要忘记了一定要关
process = null;
}
}
}
}