bat 脚本清空窗口内容_tomcat9.0启动脚本startup.bat的分析

1、 Apache Tomcat的下载和安装

从Apache官网https://tomcat.apache.org/可以下载各种版本的tomcat软件,下载的文件格式可以是zip/tar.gz/exe形式的。

如下图所示,在64位windows中使用tomcat,我们可以下载"64-bit Windows.zip",直接解压缩就可以使用;或者下载"32-bit/64-bit Windows Service Installer",通过exe安装tomcat后使用。

3e6afdd88d1376bf79b44c8d61b051b9.png

2、 tomcat的bin目录

无论哪种形式获得的tomcat服务器软件,在tomcat的主目录下都有一个bin目录,该bin目录中存在tomcat服务器启动、停止和运行所必须的批处理/SHELL脚本、exe可执行程序和一些jar包。

本文只介绍其中的startup.bat脚本程序,该脚本程序通过调用其他脚本用于启动tomcat服务器。

b01e7f34800cf60f9b37756c469ff9f7.png

3、 startup.bat脚本的主要功能

该脚本功能很简单,主要实现两方面的功能:找到catalina.bat脚本,该脚本用于实际启动tomcat服务器;组织参数传递给catalina.bat,调用call该脚本执行。

4、 startup.bat脚本详细执行过程

下面文字删掉了startup.bat脚本文件的英文注释,只保留了脚本中可以实际执行的语句,分析了每一条语句的功能。

另,分析的文字放在了rem注释中。rem注释中多数为汉字,操作系统解释该脚本时有时会和后续行的指令发生勾连,造成脚本执行报错。故,每个rem注释语句的最后添加了一个英文形式的点号,这样脚本能正常执行。

另,下面的脚本在tomcat9.0的startup.bat基础上做了些许修改,确保该脚本不仅仅可以完成tomcat的启动操作,其他如stop操作等都可以正常执行。

------ startup.bat ----

@echo off

rem @echo off从本条命令开始关闭回显,如果是echo off则是从下条命令开始关闭回显.

rem 关闭回显是执行bat文件时,在cmd窗口看不到bat执行的命令,但可以看到输出结果.

rem 打开回显,则执行的命令和输出在cmd窗口都能看到.

rem bat脚本一般第一条指令就是这条.

setlocal

rem 设置局部于setlocal和endlocal之间的变量,没有endlocal就直接到bat文件结尾处.

set "CURRENT_DIR=%cd%"

rem %cd%:脚本执行的当前目录,这里的当前目录有可能和脚本实际所在目录不一致.

rem %~dp0%:脚本文件所在目录,注意,目录的路径为全路径,并且带结尾的,前者不带.

rem 上面set语句将脚本执行的当前目录名赋给局部变量CURRENT_DIR.

rem 如果CATALINA_HOME的内容不是空,即变量已经设置好了,则直接跳转,不用再赋值了.

if not "%CATALINA_HOME%" == "" goto gotHome

rem 否则取出变量CURRENT_DIR的值赋给CATALINA_HOME这个环境变量.

set "CATALINA_HOME=%CURRENT_DIR%"

rem 若CATALINA_HOME下面的bin目录下存在catalina.bat文件,则直接跳转,不用再赋值.

if exist "%CATALINA_HOME%bincatalina.bat" goto okHome

rem 否则向前退一级目录后将目录名赋给CATALINA_HOME,并转到该目录下.

cd ..

set "CATALINA_HOME=%cd%"

cd "%CURRENT_DIR%"

:gotHome

rem 如果找到了catalina.bat,则转到后面执行该批处理文件.

if exist "%CATALINA_HOME%bincatalina.bat" goto okHome

rem 否则找不到catalina.bat文件,在cmd窗口回显下面的提示,跳转到end,结束脚本执行.

echo The CATALINA_HOME environment variable is not defined correctly

echo This environment variable is needed to run this program

goto end

:okHome

rem 将catalina.bat的全路径名赋给变量EXECUTABLE

set "EXECUTABLE=%CATALINA_HOME%bincatalina.bat"

rem 如果EXECUTABLE中的全路径名存在,则转到执行程序的位置执行启动程序.

if exist "%EXECUTABLE%" goto okExec

rem 否则如果全路径名不存在,提示不能执行启动程序,跳转到最后end结束脚本执行.

echo Cannot find "%EXECUTABLE%"

echo This file is needed to run this program

goto end

:okExec

rem 设置startup.bat的命令行参数,初始化参数为空.

set CMD_LINE_ARGS=

:setArgs

rem 将startup.bat文件的命令行参数存储在CM_LINE_ARGS中.

rem 如果第一个位置的命令行参数为空,则结束拼装命令行参数.

if ""%1""=="""" goto doneSetArgs

rem 将第一个参数并入命令行参数变量中.

set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1

rem 命令行参数中参数左移一位,即将第二个参数移到第一个参数的位置.

rem 第三个参数移到第二个参数的位置等等.

shift

rem 跳转到:setArgs处,完成当前参数拼装,当参数为空时跳出setArgs循环.

goto setArgs

:doneSetArgs

rem 执行该startup.bat文件可以有如下的一些参数.

rem C>startup.bat

rem C>startup.bat start

rem C>startup.bat stop

rem C>startup.bat debug

rem C>startup.bat start -security

rem C>startup.bat run

rem C>startup.bat run -security

rem 只运行了startup.bat文件,没有指定命令行参数,默认就当成启动操作.

rem 拼装start参数给批处理程序.

if "%CMD_LINE_ARGS%" == "" set CMD_LINE_ARGS=start

echo 调用catalina.bat的命令:%EXECUTABLE% %CMD_LINE_ARGS%

rem 调用catalina.bat批处理脚本文件

call "%EXECUTABLE%" %CMD_LINE_ARGS%

:end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

33迭代器模式(Iterator Pattern)

动机(Motivate): 在软件构建过程中,集合对象内部结构常常变化各异。但对于这些集合对象,我们希望在不暴露其内部结构的同时,可以让外部客户代码透明地访问其中包含的元素;同时这种“透明遍历”也为“ 同一种算法在多种集合对象上进行操作…

32命令模式(Command Pattern)

耦合与变化: 耦合是软件不能抵御变化灾难的根本性原因。不仅实体对象与实体对象之间存在耦合关系,实体对象与行为操作之间也存在耦合关系。 动机(Mot…

34观察者模式(Observer Pattern)

动机(Motivate):在软件构建 过程中,我们需要为某些对象建立一种“通知依赖关系” --------一个对象(目标对象)的状态发生改变,所有的依赖对象(观察者对象)都将得到通知。如果这样的依赖关系过于紧密&#x…

36中介者模式(Mediator Pattern)

依赖关系的转化: 动机(Motivate): 在软件构建过程中,经常会出现多个对象互相关联交互的情况,对象之间常常会维持一种复杂的引用关系,如果遇到一些需求的更改,这种直接的引用关系将面临不断的变化。 在这种情况…

相似理论与模型试验_正交实验下的固液耦合相似材料研究

原标题:基于正交试验的固液耦合相似材料研究摘 要:为了研究矿井突水演化规律,通过正交试验研制出一种能同时满足固体力学与水理性的固液 耦合相似材料,该相似材料以河沙为骨料、水泥和大白粉为胶结剂、液体石蜡和淀粉为调节剂。采用 极差分析…

35解释器模式(Interpreter Pattern)

动机(Motivate): 在软件构建过程中,如果某一特定领域的问题比较复杂,类似的模式不断重复出现,如果使用普通的编程方式来实现将面临非常频繁的变化。 在这种情况下,将特定领域的问题表达为某种文法规则下的句子,…

37职责链模式(Chain of Responsibility Pattern)

动机(Motivate): 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合。 如何使请求的发送者不需要指定具体的接受…

python3中format函数列表_Python3之字符串格式化format函数详解(上)

173.jpg概述在Python3中,字符串格式化操作通过format()方法或者fstring实现。而相比于老版的字符串格式化方式,format()方法拥有更多的功能,操作起来更加方便,可读性也更强。该函数将字符串当成一个模板,通过传入的参数…

38备忘录模式(Memento Pattern)

对象状态的回溯: 对象状态的变化无端,如何回溯/恢复对象在某个点的状态? 动机: 在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够…

39策略模式(Strategy Pattern)

算法与对象的耦合: 对象可能经常需要使用多种不同的算法,但是如果变化频繁,会将类型变得脆弱... 动机: 在软件构建过程中,某些对象使用的算法可能多种多样,经常改变,如果将…

40访问者模式(Visitor Pattern)

类层次结构的变化: 类层次结构中可能经常由于引入新的操作,从而将类型变得脆弱... 动机: 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为(方法),如果直接…

41状态模式(State Pattern)

对象状态影响对象行为: 对象拥有不同的状态,往往会行使不同的行为... 动机: 在软件构建过程中,某些对象的状态如果改变以及其行为也会随之而发生变化,比如文档处于只读状态,其支…

python中空格属于字符吗_举例说明python中空格是属于字符

python中空格属于字符吗?答案是肯定的,空格在Python中也是属于字符的。案例:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。#!/usr/bin/python# -*- coding: UTF-8 -*-import strings raw_input(input a st…

【转】如何将域中的AD数据导入SharePoint

最近刚装好sharepoint2010,想要研究一下,第一件想做的事就是想把AD中的用户信息导入到SharePoint中。 那现在就来看看我是怎么操作的: 1.打开管理中心 sharepoint是通过“用户配置文件同步服务”来实现同步,所以第一步要开启这个…

Apsara Clouder专项技能认证:实现调用API接口

一.API 简介 1.API 的概念 API(Application Programming Interface应用程序编程接口)是一些预定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问源码或理解内部工作机制的细节 2.API 的特点 API 是一个明确定义的接口,可以为其…

第一节:复习委托,并且通过委托的异步调用开启一个新线程和异步回调、异步等待

一. 再谈委托 1. 委托是一个关键字为delegate的自定义类型,通过委托可以把方法以参数的形式传递给另外一个方法,实现插件式的开发模式; 同时调用委托的时候,委托所包含的所有方法都会被实现。 2. 委托的发展历史:new…

linux 修改 java 内存_Linux 和 Windows修改Java虚拟机内存大小

因为内存溢出问题1. Linux下直接修改%tomcat_home%/bin/catalina.sh文件在注释下紧接一行也就是脚本正文开始之前 加上Java_OPTS-server -Xms512m -Xmx1024m -XX:PermSize128m -XX:MaxPermSize512m如果报-x没有定义,则用declare -x JAVA_OPTS"-Xms512m -Xmx1024"初始…

第二节:深入剖析Thread的五大方法、数据槽、内存栅栏

一. Thread及其五大方法 Thread是.Net最早的多线程处理方式,它出现在.Net1.0时代,虽然现在已逐渐被微软所抛弃,微软强烈推荐使用Task(后面章节介绍),但从多线程完整性的角度上来说,我们有必要了解下N年前多线程的是怎么…

java redis 生成唯一id_Redis在集群环境中生成唯一ID

概述设计目标:每秒最大生成10万个ID,ID单调递增且唯一。Reidis可以不需要持久化ID。要求:集群时钟不能倒退。总体思路:集群中每个节点预生成生成ID;然后与redis的已经存在的ID做比较。如果大于,则取节点生成的ID&#…

java await signal_【Java并发008】原理层面:ReentrantLock中 await()、signal()/signalAll()全解析...

一、前言上篇的文章中我们介绍了AQS源码中lock方法和unlock方法,这两个方法主要是用来解决并发中互斥的问题,这篇文章我们主要介绍AQS中用来解决线程同步问题的await方法、signal方法和signalAll方法,这几个方法主要对应的是synchronized中的…