✨我是喜欢分享知识、喜欢写博客的YuShiwen,与大家一起学习,共同成长!
闻到有先后,学到了就是自己的,大家加油!
前几天部门的技术经理给我分配了一个任务,叫我一个人去维护之前上古时期的Java Wbe项目,这个项目其实是一个前置机程序,负责消息的加解密、加签验签
和消息的转发
;这个程序部署于Servlet容器中,用的是Tomcat服务,并且这个Tomcat服务我们公司的运维人员不知道怎么操作,说配置的步骤太多了,之前有一个人配置成功了,但是离职了,写的文档也模糊不清,现在他们都不知道咋配置,1000-9999人的公司,这个运维人员不大行,算了不吐槽了(⊙﹏⊙)!
运维人员和笔者说,这个前置机程序是运行在客户那边的,最好是不需配置环境变量等其他操作,做到一键点击即可启动Tomcat服务。这样古老项目的维护难度又提高了亿丢丢。
笔者解压缩了之前项目的压缩包后,看了一下,发现启动的步骤是用的Tomcat的startup.bat批处理文件
(Windows系统)进行启动的,下面会详细讲。
好了,下面进入正文:
首先之前开发的源码已经丢失了,只有编译后的class文件;
当我拿到程序编译后的class文件后,用idea打开,idea自带反编译功能,如下是小demo(公司的代码不能向外界提供,所以这里提供了一个小demo):
比如我打开JDK中的Integer类,上面说到过用idea打开是自动进行了反编译的结果,如下:
那么如何查看反编译前的字节码文件呢,我们在idea中也可以查看,如下操作:(点击View–>Show Bytecode)
字节码文件的内容如下:
好说到这里,咋们就打住,关于如何查看字节码的内容,这个咋们之后再聊(会写一篇关于这个的博文)。
回到主题,刚开始说了,idea自动进行的反编译,还好之前的项目写的代码不多,看了半天代码后,理清思路,然后又花费一天时间,写代码,自测,修改,又自测,终于写好了,自测通过;接下来的任务就是之前运维提到的,去掉项目启动前环境变量配置的过程,优化一系列的操作,做到点击startup.bat批处理文件
即可一键启动Tomcat服务。
startup.bat批处理文件
启动Tomcat服务startup.bat批处理文件
如下是Tomcat的文件目录,关于Tomcat目录的讲解,可以参考笔者之前的博文:https://blog.csdn.net/MrYushiwen/article/details/113383917
因为是点击startup.bat批处理文件
进行启动的,我第一反应就是用文本编辑器打开startup.bat文件,点击进入bin目录下,bin目录如下,等会讲解红色框中的三个批处理文件:
找到startup.bat批处理文件,用文本编辑器打开,具体内容如下(嘿嘿,之前有写过批处理脚本的我还是看得懂的哈,看不懂的小伙伴可以参看下面的章节三,关于批处理文件的讲解零基础快速入门):
第一个红色框这条语句是检测CATALINE_HOME的值,如果不为空,就跳转到gotHome标记出执行。可以看到在这个批处理文件中,多次用到了CATALINA_HOME变量,这个变量我们可以在环境变量中进行配置,关于环境变量深入的理解,可以参考笔者这篇博文:https://blog.csdn.net/MrYushiwen/article/details/120509711,因为在批处理文件中用到了这个CATALINE_HOME变量,它可以取自环境变量
,也可以用set命令给CATALINE_HOME变量赋值;所以之前我们需要设置如下环境变量
才可以运行:
第二个红框设置变量EXECUTABLE的值为CATALINE_HOME变量下的bin包下的catalina.bat批处理文件,这个EXECUTABLE在第三步中会用到。
第三个红框用call命令进行调用,启动EXECUTABLE环境变量所指向的程序,即catalina.bat。
好了,startup.bat批处理文件
讲解完了,如果我们不想配置环境变量CATALINE_HOME的值,根据上面提到的我们只需要在startup.bat批处理文件
头部加上set CATALINE_HOME=xxx
(注意等号后面不允许有空格,本人踩过坑)即可,这样就不会从环境变量值获取该值了,直接在批处理文件中就有定义,如下(笔者的路径就是本项目的Tomcat,即就是解压缩之后的文件所在的路径):
catalina.bat批处理文件
上面提到过startup.bat批处理文件会用call命令调用catalina.bat批处理文件,我们用文本编辑器打开catalina.bat批处理文件,如下:
第一个红色框,可以看到在catalina.bat批处理文件中也同样用到了CATALINE_HOME这个变量,如果我们不想配置环境变量,同样也可以在文件的开始处加上set CATALINE_HOME=xxx
即可。
第二个红色框,用call命令调用了setclasspath.bat批处理文件
。
同样我们不想配置环境变量,在文件的开始处加上set CATALINE_HOME=xxx
即可,如下:
setclasspath.bat批处理文件
接下来我们点进setclasspath.bat批处理文件
中查看,如下:
第一个红框中可以看到setclasspath.bat批处理文件
用到了JAVA_HOME和JRE_HOME这两个变量,如果们配置了环境变量,可以从环境变量中取,我们也可以用set命令在文件头部指定(如下图一),我们指定了就不需要配置Java的环境变量了,当然JDK需要放到Tomcat的目录中去(如下图二),虽然文件大了点,但是方便了用户。这样就做到了不需要配置环境变量,通过startup.bat批处理文件
一键启动Tomcat服务。
根据上面的2.1 、2.2、2.3的分析,我们现在总结一下:
bin目录下的startup.bat—调用—>catalina.bat—调用—>setclasspath.bat
说明:
我们在startup.bat、catalina.bat和setclasspath.bat这三个批处理文件中用set操作对需要用到的变量进行赋值,这样就不需要再去配置环境变量了。
我们以Tomcat中的startup.bat为例进行讲解:(其中rem为注释,大部分rem已被笔者删掉),文件内容如下:
对上述的脚本一行行的分析(大家耐心看完,绝对会有很大的收获,如果对命令不是很了解的话,可以看下该篇文章进行学习:批处理命令教程;然后在过来看笔者这里写的,妥妥地保姆级别分析源码):
@echo off
if "%OS%"=="Windows_NT" setlocal
set CURRENT_DIR = %cd%
if not "%CATALINE_HOME%"=="" goto gotHome
: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 .....
goto end
11.if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
一起看,如果if条件不成立,就跳转到end标记处,继续往下执行,其实就是结束了此次批处理命令。:okHome
set EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat
if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHome
echo Cannot find ......
eco This file ......
goto end
:okExec
set CMD_LINE_ARGS=
:setArgs
if ""%1""=="""" goto doneSetArgs
知识点:关于这里的%1 还有下面的第26条命令shift
比如有如下的文件:demo.bat
demo.bat文件的内容为:echo %0 %1 %2 %3 ,(如下图图A)
demo.bat这个批处理文件只有一条语句,在命令行中执行这条语句:demo.bat a b c d e
那么结果就会打印出如下内容:(如下图图B)
C:\Users\yclw060\Desktop>demo.bat a b c d e
C:\Users\yclw060\Desktop>echo demo.bat a b c
demo.bat a b c
说明:%0 %1 %2 %3都表示变量
%0表示这个批处理文件的文件名,%1表示传递给该批处理文件的第一个参数,%2表示传递给该批处理文件的第二个参数,%3表示传递给该批处理文件的第三个参数,一直可以用这个方法传递9个参数,即使用到%9,但是如果参数再多了,应该如何处理呢?
这时候shift命令就派上用场了
现在我们来更改demot.bat的内容,更改后的内容如下:(如下图图C)
shift
echo %0 %1 %2
做了这些更改之后,同样执行上面的命令:demo.bat a b c d e
shift这个命令的作用就是把传递的参数依次前移,这样%0就代表了a,%1代表b,%2代表c,%3代表d了。(如下图图D)
如果让e显示出来,就需要用两次shift,那么此时%0就代表了b,%1代表c,%2代表d,%3代表e。
图D
set CMD_LINE_ARGS=%CMD_LINE_ARGS% %1
shift
goto setArgs
doneSetArgs
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
能坚持到这里,相信大家一定会有所收获,另外,如果觉得笔者写得还八错,期待后续的博文可以点波关注哈!
知我所能,我所能者,尽善尽美; 知我所不能,我所不能者,虚怀若谷!
我是喜欢分享知识、喜欢写博客的YuShiwen,与大家一起学习,共同成长!咋们下篇博文见。