千家信息网

Tomcat怎么做到一键式启停

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要讲解了"Tomcat怎么做到一键式启停",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Tomcat怎么做到一键式启停"吧!脚本分析start
千家信息网最后更新 2026年11月02日Tomcat怎么做到一键式启停

这篇文章主要讲解了"Tomcat怎么做到一键式启停",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"Tomcat怎么做到一键式启停"吧!

脚本分析

start.sh和start.bat里面的内容相同,所以这里就主要分析start.sh的内容了。

os400=false case "`uname`" in OS400*) os400=true;; esac # resolve links - $0 may be a softlink # PRG是脚本路径,如果当前脚本文件为软连接,则会解析出PRG真正文件所在的路径 PRG="$0" while [ -h "$PRG" ] ; do # 判断是否为软连接  ls=`ls -ld "$PRG"` # 如果是软连接,输出中含有lin -> source的字符串  link=`expr "$ls" : '.*-> \(.*\)$'` # 模式匹配出源文件的路径  if expr "$link" : '/.*' > /dev/null; then # 正则匹配 /.* 这里expr会输出匹配个数,如果不为0,则说明$link包含目录  PRG="$link"  else  PRG=`dirname "$PRG"`/"$link" # 当不包含目录,说明软连接和源文件在同一目录  fi done # 获取脚本目录路径 PRGDIR=`dirname "$PRG"` EXECUTABLE=catalina.sh # Check that target executable exists if $os400; then  # -x will Only work on the os400 if the files are:  # 1. owned by the user  # 2. owned by the PRIMARY group of the user  # this will not work if the user belongs in secondary groups  eval else  if [ ! -x "$PRGDIR"/"$EXECUTABLE" ]; then  echo "Cannot find $PRGDIR/$EXECUTABLE"  echo "The file is absent or does not have execute permission"  echo "This file is needed to run this program"  exit 1  fi fi # 执行catalina.sh的start命令 exec "$PRGDIR"/"$EXECUTABLE" start "$@"

其实上面简单来说就做了两件事

  1. 拿到脚本的真正路径

  2. 执行catalina.sh的start命令

而shutdown.sh和start.sh命令一样,只不过后面是执行catalina.sh的stop命令

catalina.sh脚本

脚本中重要的步骤有以下几个

1.设置两个重要的环境变量,CATALINA_HOME、CATALINA_BASE

PRGDIR=`dirname "$PRG"`     [ -z "$CATALINA_HOME" ] && CATALINA_HOME=`cd "$PRGDIR/.." >/dev/null; pwd`     [ -z "$CATALINA_BASE" ] && CATALINA_BASE="$CATALINA_HOME"

设置CLASSPATH变量,这里注意,默认是没有setenv.sh文件的,可以自己新建一个并添加参数

CLASSPATH=  if [ -r "$CATALINA_BASE/bin/setenv.sh" ]; then  . "$CATALINA_BASE/bin/setenv.sh"  elif [ -r "$CATALINA_HOME/bin/setenv.sh" ]; then  . "$CATALINA_HOME/bin/setenv.sh"  fi

将bootstrap.jar作为CLASSPATH变量传进去

if [ ! -z "$CLASSPATH" ] ; then      CLASSPATH="$CLASSPATH":     fi     CLASSPATH="$CLASSPATH""$CATALINA_HOME"/bin/bootstrap.jar     if [ -z "$CATALINA_OUT" ] ; then      CATALINA_OUT="$CATALINA_BASE"/logs/catalina.out     fi

执行脚本参数,执行bootstrap.jar中的Bootstrap类中main方法,并传入参数start

hift  eval exec "\"$_RUNJAVA\"" "\"$LOGGING_CONFIG\"" $LOGGING_MANAGER $JAVA_OPTS $CATALINA_OPTS \  -D$ENDORSED_PROP="\"$JAVA_ENDORSED_DIRS\"" \  -classpath "\"$CLASSPATH\"" \  -Djava.security.manager \  -Djava.security.policy=="\"$CATALINA_BASE/conf/catalina.policy\"" \  -Dcatalina.base="\"$CATALINA_BASE\"" \  -Dcatalina.home="\"$CATALINA_HOME\"" \  -Djava.io.tmpdir="\"$CATALINA_TMPDIR\"" \  org.apache.catalina.startup.Bootstrap "$@" start

在上面脚本中我们可以看出最后执行的都是从Bootstrap的main方法作为入口的,所以我们打开Tomcat源码进去Bootstrap类中看它到底做了什么。

启动类分析

作为Tomcat的入口类,我们先看看Bootstrap中做了什么。这里只贴出main方法中重要的代码。

//初始化类加载器并且将Catalina文件加载进内存中 bootstrap.init(); String command = "start"; if (args.length > 0) {  command = args[args.length - 1]; } if (command.equals("startd")) {  args[args.length - 1] = "start";  //调用Catalina.java的load方法  daemon.load(args);  //调用Catalina.java的start  daemon.start(); } else if (command.equals("stopd")) {  args[args.length - 1] = "stop";  //调用Catalina.java的stop  daemon.stop(); } else if (command.equals("start")) {  daemon.setAwait(true);  daemon.load(args);  daemon.start();  if (null == daemon.getServer()) {  System.exit(1);  } } else if (command.equals("stop")) {  daemon.stopServer(args); } else if (command.equals("configtest")) {  daemon.load(args);  if (null == daemon.getServer()) {  System.exit(1);  }  System.exit(0); } else {  log.warn("Bootstrap: command \"" + command + "\" does not exist."); }

这里是根据脚本中传入的不同命令,调用Catalina不同的方法。由于我们主要分析的Tomcat如何做到一键式启停的,所以我们主要分析Catalina的start方法。

在Catalina的satrt方法中我们看到了这一句

getServer().start();

随后经过Debug都是经过了Lifecycle的start方法,我们把Lifecycle的方法列出来

public interface Lifecycle {  public void addLifecycleListener(LifecycleListener listener);  public LifecycleListener[] findLifecycleListeners();  public void removeLifecycleListener(LifecycleListener listener);  public void init() throws LifecycleException;  public void start() throws LifecycleException;  public void stop() throws LifecycleException;  public void destroy() throws LifecycleException;  public LifecycleState getState();  public String getStateName();  public interface SingleUse {  } }

然后再看它的实现类,我们发现我们前面所讲的整体架构中的组件都实现了此类。而在它的子类LifecycleBase实现了start、init、stop等方法,并且里面都相应调用了startInternal、initInternal、stopInternal方法,这里我们如果对于设计模式了解的话,应该会想到这里运用了模板设计模式,抽象出所有子类的公有的代码,然后重新定义一个内部抽象方法,其子类实现自己的定制化的操作。

在Server.xml中我们发现第一个层级也是Server,然后Catalina的satrt方法中第一个启动的也是Server。

上面表示了Tomcat所有模块的层级结构,只要是带有层级的结构,我们应该能够立马想到组合设计模式,从这个层级结构中我们能够得到模块之间的关系,有大有小,有内有外。

  • 有大有小:大组件管理小组件,例如Server管理Service,Service管理连接器和容器

  • 有内有外:连接器控制对外的连接,而外层组件调用内层组件完成业务功能。即请求处理的过程是由外层组件驱动的。

那么根据上面的两条,我们知道,有小才有大,有内才有外。这也就是整个层级的加载顺序,先加载小组件再加载大组件,先加载内层组件再加载外层组件。此时我们应该就明白了Tomcat是如何做到一键式启停的了。通过层级结构,加载的优先级。层层迭代进行启动。而停止和启动差不多。也是层层迭代进行停止。

感谢各位的阅读,以上就是"Tomcat怎么做到一键式启停"的内容了,经过本文的学习后,相信大家对Tomcat怎么做到一键式启停这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

方法 脚本 组件 一键 层级 命令 路径 分析 内容 文件 模式 目录 结构 重要 参数 变量 外层 设计模式 学习 管理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技工作委员会毛军 小马过河互联网科技 电子科技大学互联网 融势互联网科技 碳银互联网科技有限公司 赫美联合互联网科技 多迪互联网科技有限公司 福州新华互联网科技学校 知乎 小米互联网科技园设置 茂名市互联网科技产业园 深圳市罗太互联网科技有限公司 玉溪新华互联网科技好不好 群盈汇互联网科技有限公司 烟台灵鸽互联网科技有限公司 广州互联网高科技取餐柜 上海同邻互联网科技有限公司规模 广州智享互联网科技 保山互联网科技靠谱吗 绵阳真晨互联网科技有限公司 伍佰万互联网科技是干嘛的 喔噻互联网科技有限公司 互联网和科技技术 杭州互联网科技公司 易通互联网络科技有限公司 丰台科技园 互联网公司 华中科技有哪些互联网大佬 广州慧亚互联网科技怎么样 工业互联网等科技实现智能化赋能 互联网方面的科技前沿 上海京穆互联网科技有限公司
0