解析Tomcat的启动脚本--catalina.bat

概述

Tomcat 的三个最重要的启动脚本:

  • startup.bat
  • catalina.bat
  • setclasspath.bat

上一篇咱们分析了 startup.bat 脚本

这一篇咱们来分析 catalina.bat 脚本.

至于 setclasspath.bat 这个脚本, 相信看完这一篇, 就可以自己看懂这个脚本了.
可以点击下载 [ setclasspath.bat 脚本 ]查看附注释的 setclasspath.bat 脚本

catalina.bat

这个脚本的代码有点多, 就单独弄了一篇展示 catalina.bat 脚本中的内容. 点击 [catalina.bat 脚本 ]下载查看.

下面咱们就按照脚本中的内容一行行的来分析.

@echo off
setlocal

这两个命令可以参考上一篇的文章(解析Tomcat的启动脚本--startup.bat)的解释

第一块脚本代码

rem Suppress Terminate batch job on CTRL+C
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.bat run

来启动 Tomcat 的.

如果用户使用 startup.bat 脚本启动 Tomcat, 那么这段脚本不会被执行.

这段代码看起来很乱, 慢慢分析.

第一行:

注释, 意思就是: 禁止使用 CTRL+C 来终止批处理任务, 也不知道是怎么禁止的.

第二行:

if not ""%1"" == ""run"" goto mainEntry

首先明白这里的这个 "%1" 这个变量代表的是什么? 正常情况下, 这个脚本是被 startup.bat 脚本调用的, 被调用的同时传递了一个 start 参数过来(上一篇分析得出的). 在 批处理命令 中 %1 就表示命令之后的第一个参数, 在这里指的就是 start. 所以 "%1" = start. 如果用户用 catalina.bat run 命令启动 Tomcat 的话, 那么这里的 "%1" = run.

第三行:

if "%TEMP%" == "" goto mainEntry

这里的 %TEMP% 很有可能被认为是 空, 其实这里可以读取到系统的环境变量. 所以, 这里的 %TEMP% 就是系统的环境变量值, 通常装完 windows 系统的话, 系统会自动配置上这个环境变量. 所以这里一般是有值的. 大家可以去系统的环境变量看一下它指向那个目录, 一般就是 C:\Users\用户名\AppData\Local\Temp. 注意: AppData 是一个隐藏目录.

第四行:

if exist "%TEMP%\%~nx0.run" goto mainEntry

这里又出现了一个新的东西 %~nx0 . 在批处理中, 我们知道 %1 表示的是程序之后的第一个参数, 那么 %0 呢? %0 表示这个可执行程序的名称, %~nx0 的话就是程序的名称+扩展名

在这里就是 catalina.bat . 大家可以写一个小脚本(test.bat)验证一下: (我的脚本放在 D 盘下)

脚本内容:

@echo off
echo "%~nx0"
echo "%1"

执行结果:

PS D:\> .\test.bat Hello
"test.bat"
"Hello"
PS D:\>

第五行:

echo Y>"%TEMP%\%~nx0.run"

这段代码很简单, 就是写入字符 Y 到 %TEMP%\catalina.bat.run 文件中.

第六行:

if not exist "%TEMP%\%~nx0.run" goto mainEntry

又判断了一下 %TEMP%\catalina.bat.run 文件是否存在.

第七行:

echo Y>"%TEMP%\%~nx0.Y"

同第五行, 写入 Y 到 %TEMP%\catalina.bat.Y . 如果文件不存在, 则新建一个.

第八行:

call "%~f0" %* <"%TEMP%\%~nx0.Y"

这一行有点意思. 又出现了两个新的东西:

(因为 markdown 语法限制, 把下面代码写到代码块里)

- "%~f0" : 简单说就是表示当前命令的绝对路径.
- "%*" : 我们知道 %1 表示第一个参数, 依次类推, %2 表示第二个.... 那么 %* 就很好理解了, 代表所有参数.

验证一下

脚本内容:

@echo off
echo "%*"
echo "%~f0"

执行结果:

PS D:\> .\test.bat Hello World
"Hello World"
"D:\test.bat"
PS D:\>

那么后面的 <"%TEMP%\%~nx0.Y" 意思就是读取 %TEMP%\catalina.bat.Y 文件中的内容.

之后又通过 call 进行调用.

我们自己写一个例子, 在 D 盘建立 test.bat 文件, 再建立 catalina.bat.Y 文件

脚本内容:

call "%~f0" %* < D:/catalina.bat.Y

catalina.bat.Y 文件内容

Y

执行结果:

........
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
D:\>call "D:\test.bat" Hello World 0<D:/catalina.bat.Y
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=593, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******

最上面省略了很多重复代码, 从这里发现它不断地调用自己本身, 直到超出了堆栈的限制才停止.

我们如果加上 @echo off 的话

@echo off
call "%~f0" %* < D:/catalina.bat.Y

结果只会出现

D:\>.\test.bat Hello World
****** B A T C H R E C U R S I O N exceeds STACK limits ******
Recursion Count=593, Stack Usage=90 percent
****** B A T C H PROCESSING IS A B O R T E D ******

我们这里只需要明白这些命令的作用就可以, 稍后我们会总结 Tomcat 执行这些命令的目的.

第十行:

set RETVAL=%ERRORLEVEL%

我们如果了解 Linux 的话都知道, 每个命令的执行都会返回一个执行完成之后的退出码. Linux执行完一条命令之后用 echo $? 来查看上一条命令的退出码. 在 Windows 中也是一样的, 命令执行完之后都有自己的退出码. 这里的 %ERRORLEVEL% 就是取的上面的 call 命令的退出码. 赋值给一个变量 RETVAL

第十一行:

del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1

这里又出现了一个 del 命令, 很容易联想到 delete, 那么 /Q 是什么意思呢? 静默删除, 不会给你任何提示, 就比如 Linux 中的 rm -f 一样, 这里是删除 %TEMP%\catalina.bat.Y 这个文件.

后面的 >NUL 2>&1 又是什么意思呢?

于 Linux 中的输出流的重定向原理是一样的.

(因为 markdown 语法限制, 把下面代码写到代码块里)

- >NUL : 表示将输出重定向到 NUL 中, 你什么也看不到
- 2>&1 : 2:错误输出, &1: 标准输出, 意思就是将错误消息输出到标准输出中.
- >NUL 2>&1 : 就是先将错误消息输出到标准输出中, 然后再输出到 NUL 中.

第十二行:

exit /B %RETVAL%

退出当前批处理, /B 指定退出时的编号, 把 RETVAL 最为 退出码, 也就是 call 执行的命令 的退出码.

最后两行:

:mainEntry
del /Q "%TEMP%\%~nx0.run" >NUL 2>&1

定义一个 mainEntry 标签, 然后删除 临时目录中的 catalina.bat.run 文件.

总结第一段脚本的功能

简单说, 这段代码的作用就是调用本身, 判断临时目录中的文件是否存在来避免二次回调自己. 感觉写的好复杂.

下面就进入 Tomcat 的正式启动过程, 并没有开始执行 main 方法

第二段脚本代码

rem Guess CATALINA_HOME if not defined
set "CURRENT_DIR=%cd%"
if not "%CATALINA_HOME%" == "" goto gotHome
set "CATALINA_HOME=%CURRENT_DIR%"
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
cd ..
set "CATALINA_HOME=%cd%"
cd "%CURRENT_DIR%"
: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
:okHome
rem Copy CATALINA_BASE from CATALINA_HOME if not defined
if not "%CATALINA_BASE%" == "" goto gotBase
set "CATALINA_BASE=%CATALINA_HOME%"
:gotBase

这段脚本还是比较简单的, 主要是设置了两个环境变量 CATALINA_HOME 和 CATALINA_BASE .

如果没有配置 CATALINA_BASE 环境变量的话, 直接引用 CATALINA_HOME 的值

静下心来稍微看一下就懂了.

第三段脚本代码

rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colon
rem as this is used as the separator in the classpath and Java provides no
rem mechanism for escaping if the same character appears in the path. Check this
rem by replacing all occurrences of ';' with '' and checking that neither
rem CATALINA_HOME nor CATALINA_BASE have changed
if "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolon
echo Using CATALINA_HOME: "%CATALINA_HOME%"
echo Unable to start as CATALINA_HOME contains a semicolon (;) character
goto end
:homeNoSemicolon
if "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolon
echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Unable to start as CATALINA_BASE contains a semicolon (;) character
goto end
:baseNoSemicolon

这里主要是判断 CATALINA_HOME 环境变量的值 和 CATALINA_BASE 环境变量的值是否以 分号为结尾, 如果以 分号为结尾的话, 就报错退出.

第四段脚本代码

rem Ensure that any user defined CLASSPATH variables are not used on startup,
rem but allow them to be specified in setenv.bat, in rare case when it is needed.
set CLASSPATH=
rem Get standard environment variables
if not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHome
call "%CATALINA_BASE%\bin\setenv.bat"
goto setenvDone
:checkSetenvHome
if exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat"
:setenvDone
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
:okSetclasspath
call "%CATALINA_HOME%\bin\setclasspath.bat" %1
if errorlevel 1 goto end

设置一个临时环境变量: CLASSPATH.

如果 Tomcat 的 bin 目录下面存在 setnv.bat 脚本的话, 就执行它. 通常情况下是没有的.

继而又判断 setclasspath.bat 脚本是否存在, 如果不存在的话, 直接报错, 停止启动 Tomcat.

如果存在的话, 就去调用它, 并把 第一个参数传进去.

setclasspath.bat 这个脚本主要设置了几个环境变量

  • JAVA_HOME
  • JRE_HOME
  • JAVA_ENDORSED_DIRS = %CATALINA_HOME%\endorsed
  • _RUNJAVA = %JRE_HOME%\bin\java.exe
  • _RUNJDB = %JAVA_HOME%\bin\jdb.exe

第五段脚本代码

rem Add on extra jar file to CLASSPATH
rem Note that there are no quotes as we do not want to introduce random
rem quotes into the CLASSPATH
if "%CLASSPATH%" == "" goto emptyClasspath
set "CLASSPATH=%CLASSPATH%;"
:emptyClasspath
set "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"
if not "%CATALINA_TMPDIR%" == "" goto gotTmpdir
set "CATALINA_TMPDIR=%CATALINA_BASE%\temp"
:gotTmpdir
rem Add tomcat-juli.jar to classpath
rem tomcat-juli.jar can be over-ridden per instance
if not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"
goto juliClasspathDone
:juliClasspathHome
set "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar"
:juliClasspathDone

这段代码主要做了三件事:

  • 把 Tomcat bin 目录下的 bootstrap.jar 加入到环境变量中
  • 设置 CATALINA_TMPDIR 环境变量的值为 Tomcat 目录下的 temp 目录
  • 把 Tomcat bin 目录下的 tomcat-juli.jar 加入到环境变量中

第六段脚本代码

if not "%JSSE_OPTS%" == "" goto gotJsseOpts
set JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048"
:gotJsseOpts
set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"
rem Register custom URL handlers
rem Do this here so custom URL handles (specifically 'war:...') can be used in the security policy
set "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"
if not "%LOGGING_CONFIG%" == "" goto noJuliConfig
set LOGGING_CONFIG=-Dnop
if not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfig
set LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties"
:noJuliConfig
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"
if not "%LOGGING_MANAGER%" == "" goto noJuliManager
set LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
:noJuliManager
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"

主要是追加一系列的启动参数到 JAVA_OPTS 这个环境变量中.

第八段脚本代码

echo Using CATALINA_BASE: "%CATALINA_BASE%"
echo Using CATALINA_HOME: "%CATALINA_HOME%"
echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"
if ""%1"" == ""debug"" goto use_jdk
echo Using JRE_HOME: "%JRE_HOME%"
goto java_dir_displayed
:use_jdk
echo Using JAVA_HOME: "%JAVA_HOME%"
:java_dir_displayed
echo Using CLASSPATH: "%CLASSPATH%"

主要是打印相关的环境变量信息.

第九段脚本代码

set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=

设置一些列的环境变量:

  • _RUNJAVA : %JRE_HOME%\bin\java.exe
  • MAINCLASS : 指定了 Tomcat 的启动类, 没错 main 方法就是在这个类里面.
  • ACTION : 动作: 就是启动
  • SECURITY_POLICY_FILE : 安全策略文件, 如果启动的时候加上了 -security 参数的话, 下面会对这个参数指定到 Tomcat 的 conf 目录下的 catalina.policy 文件.
  • JPDA : 这个参数可以百度一下, 我们平时几乎用不到.

第十段代码

if not ""%1"" == ""jpda"" goto noJpda
set JPDA=jpda
if not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransport
set JPDA_TRANSPORT=dt_socket
:gotJpdaTransport
if not "%JPDA_ADDRESS%" == "" goto gotJpdaAddress
set JPDA_ADDRESS=localhost:8000
:gotJpdaAddress
if not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspend
set JPDA_SUSPEND=n
:gotJpdaSuspend
if not "%JPDA_OPTS%" == "" goto gotJpdaOpts
set JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%
:gotJpdaOpts
shift
:noJpda

好像直接从第一行跳到了最后一行, 没错, 一般我没启动的时候没有加 jpda 参数的话, 这里会直接跳过, 里面的脚本是关于 JPDA 的设置等.

第十一段脚本代码

if ""%1"" == ""debug"" goto doDebug
if ""%1"" == ""run"" goto doRun
if ""%1"" == ""start"" goto doStart
if ""%1"" == ""stop"" goto doStop
if ""%1"" == ""configtest"" goto doConfigTest
if ""%1"" == ""version"" goto doVersion
echo Usage: catalina ( commands ... )
echo commands:
echo debug Start Catalina in a debugger
echo debug -security Debug Catalina with a security manager
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
echo configtest Run a basic syntax check on server.xml
echo version What version of tomcat are you running?
goto end

好似一个 switch 开关.

  • 如果我们用 startup.bat 启动 Tomcat 的话, 这里的 "%1" 的值是 start
  • 如果通过 catalina.bat run 启动 Tomcat 的话, 这里的 "%1" 的值是 run

第十二段脚本代码

:doRun
shift
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd
:doStart
shift
if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
if not ""%1"" == ""-security"" goto execCmd
shift
echo Using Security Manager
set "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"
goto execCmd

首先分析一下其中的两个 shift 命令

第一个 shift 是把 start 或者 run 参数移除, 然后下面 还是利用 "%1" 来取参数, 这时候, 取出来的就是参数列表中的第二个.

第二个 shift 是在第二个参数移除掉.

我们再来比较一下 start 和 run 的启动区别.

差别

if "%TITLE%" == "" set TITLE=Tomcat
set _EXECJAVA=start "%TITLE%" %_RUNJAVA%
  • 如果是 startup.bat 脚本启动的话, 会启动一个新的 cmd 窗口, 并且把 cmd 的 title 设置为 Tomcat.
  • 如果是 catalina.bat run 启动的话, 不会新建 cmd 窗口, 也不会设置 cmd 的 title.

最后都跳到了 execCmd 标签处.

第十三段脚本代码

: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
:doneSetArgs

这里还是利用 "%1" 来取出启动命令之后的参数, 如果存的话, 追加到 CMD_LINE_ARGS 环境变量上, 并把这个参数移除.

通常情况下, 我们这里是不会有什么参数了, -security 这个参数我们都不会追加.

继续往下走.

第十四段脚本代码

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

很明显, 我们的 %JPDA% 没有值, 不会跳转; 由于我们没有加 -security 参数, 所以 %SECURITY_POLICY_FILE% 没有值, 不会跳转.

下面这段长命令就是来启动 BootStrap 类, 并把相应的参数传进去.

只要把对应的环境变量替换为它们的值, 就可以解析出这个长命令的内容. 相信你可以的. Be patient!

总结一下

  1. 首先判断一下用户直接使用 catalina.bat run 来启动 Tocmat
  2. 设置 CATALINA_HOME 和 CATALINA_BASE 环境变量值
  3. 验证 CATALINA_HOME 和 CATALINA_BASE 环境变量值的正确性
  4. 调用 setnv.bat 脚本
  5. 调用 setclasspath.bat 脚本
  6. 添加 bootstrap.jar 和 tomcat-juli.jar 到 CLASSPATH 中
  7. 设置 CATALINA_TMPDIR 临时目录的值为 Tomcat 目录下的 temp
  8. 追加一系列的参数到 JAVA_OPTS 中
  9. 整合相关的启动信息, 参数
  10. 启动 Tomcat

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,有兴趣的朋友可以看下上篇文章《解析Tomcat的启动脚本-startup.bat》

(0)

相关推荐

  • Tomcat中的catalina.bat原理详细解析

    前言 本文主要给大家详细解析了关于Tomcat中catalina.bat原理的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. tomcat 的真正启动是在 catalina.bat 设置并启动的.startup.bat 只是找到catalina.bat 然后执行catalina.bat 来启动tomat的.下面我们来分析下catalina.bat 验证CATALINA_HOME 环境变量 验证CATALINA_HOME 设置是否正确,如果不正确,重新设置CATALIN

  • 解析Tomcat的启动脚本--catalina.bat

    概述 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 catalina.bat 脚本. 至于 setclasspath.bat 这个脚本, 相信看完这一篇, 就可以自己看懂这个脚本了. 可以点击下载 [ setclasspath.bat 脚本 ]查看附注释的 setclasspath.bat 脚本 catalina.bat 这个脚本的代码有点多, 就单独弄

  • 解析Tomcat的启动脚本--startup.bat

    概述 我们通常使用 Tomcat 中的 startup.bat 来启动 Tomcat. 但是这其中干了一些什么事呢? 大家都知道一个 Java 程序需要启动的话, 肯定需要 main 方法, 那么这个 main 方法在哪呢? Tomcat 脚本中又是配置了一些什么参数呢, 什么情况下 Tomcat 会启动失败呢? 带着一些列的疑问我们来分析 Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat startup.bat 脚本 该

  • 非常实用的Tomcat启动脚本实现方法

    前言 有这样一个场景,公司为了安全起见,需要对所有登录Linux服务器做安全限制,要求除了管理员其他要登录linux服务器的员工不能用最高权限账号登录,要创建新的用户,对目录及文件权限做出控制,只能对需要操作的目录允许读,写,执行权限,其他目录只有读的权限,并且所有tomcat不能直接在bin中用startup.sh,shutdown.sh进行启动和停止,要通过写shell脚本进行此操作,也就是说有两个步骤,创建用户并设置权限,写tomcat启动脚本,下面我们就完成这两个步骤. 1.首先我们就来

  • Tomcat中catalina.bat设置为UTF-8控制台出现乱码

    1.catalina.bat中必须设置为UTF-8,如果我不设置为UTF-8,页面接收到的就是乱码了,尝试过各种UTF-8的调试,都无解,最后还是只能在catalina.bat的set "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%  -Dfile.encoding=UTF-8" ,加上UTF-8问题就可以解决了,但是tomcat的命令框和输出日志都是乱码. 2.如果是用编译工具,在IDEA编译器中的VM options:设置-Dfile.encoding=UTF

  • windows使用批处理发布web到tomcat并启动tomcat脚本分享

    复制代码 代码如下: @ECHO OFF@REM 部署WEB系统到Tomcatset date=%date:~0,10%set time=%time:~0,8%set currDate=%date% %time%echo 开始运行将工作空间里面编译后的代码拷贝到Tomcat中...%currDate% echo 设置参数set WORK_SPACE=J:\飘\IT\workspaceset PRJ_NAME=MyStruts1Prjset PRJ_WEB_ROOT=MyStruts1Prj\We

  • 解析Tomcat架构原理到架构设计

    目录 一.学习目的 1.1.掌握 Tomcat 架构设计与原理提高内功 1.2.宏观理解一个请求如何与 Spring 联系起来 1.3.提升自己的系统设计能力 二.整体架构设计 2.1.连接器 2.2.封装变与不变 2.3.容器 2.4.请求定位 Servlet 的过程 三.Tomcat 为何打破双亲委派机制 3.1.双亲委派 3.2.Tomcat 热加载 3.3.Tomcat 的类加载器 3.4.Tomcat 类加载器层次 四.整体架构设计解析收获总结 4.1.连接器 4.2.容器 4.3.类

  • Tomcat安装shell脚本的方法步骤

    目录 一.JAVA环境安装 二.JAVA环境安装检测 三.tomcat安装与启动 四.tomcat启动检测 五.脚本程序 六.执行效果检验 今天继续给大家介绍Linux运维相关知识,本文主要内容是Tomcat安装shell脚本(假设我们已经下载下来了JAVA和Tomcat的安装包). 一.JAVA环境安装 首先,要安装Tomcat,我们就必须安装JAVA环境.JAVA环境的安装需要解压JAVA的安装包,并且设置JAVA的环境变量,相关脚本如下所示: tar xf jdk-8u45-linux-x

  • Tomcat使用Log4j输出catalina.out日志

    Tomcat默认的日志是用java.util.logging,有几点不足,文件catalian.out不能像log4j一样按天生成,将越来越大.日志格式和项目中用log4j打出来的不一致,不利于解析. 从tomcat官网(https://tomcat.apache.org/tomcat-7.0-doc/logging.html)上找了下,修改一些配置.替换扩展包即可使用log4j输出catalian.out. 在$CATALINA_BASE/lib下创建log4j.properties文件 lo

  • tomcat应用文件备份脚本及日志备份脚本的示例代码

    下面先给大家介绍tomcat应用文件备份脚本 #!/bin/bash #Back up the entire tomcat8080-dist to the /backup directory backuppath=/mnt/tomcat8080-dist/webapps/ backpath=/backup/backup-tomcat8080-dist/ action=/backup/backup-tomcat8080-dist/ APPNAME=dist BACKUPNAME1=dist BAC

随机推荐