CATALINA_HOME环境变量之坑

一切都是巧合!

问题描述

今天的任务是在一个Web服务中新增一个接口供另一个Web服务通过Http进行访问。
使用的IDE是IDEA,到现在还没有弄明白怎样在IDEA内同时启动两个Web服务进行调试(并且这两个Web服务属于同一个Project的两个Module)。所以采取的方法是分别调通后联调,步骤如下:
- 在IDE中启动提供接口的服务A,通过浏览器直接访问对应的URL,将A服务的接口调试通过;
- 在本地的Tomcat中发布服务A,并启动Tomcat;
- 在IDE中启动调用接口的服务B,并访问Tomcat中的服务A的接口。


看上去应该没什么问题,然而,诡异的事情出现了:
- 服务B在调用时提示404 NOT FOUND;
- 直接在浏览器中访问服务A的接口,也是404 NOT FOUND;
- 重新在IDEA中启动服务A,访问接口,没问题;
- 重新发布一遍,仍然404;
- 而在浏览器中访问服务A的一个旧接口,却是正常的……

问题定位

不可能见鬼,所以肯定哪里出问题了。
从问题的表象来看,新接口404,旧接口200。看上去是新接口丢失了!
在IDEA中启动时服务的端口是Tomcat的默认端口8080,在独立的Tomcat中启动时将端口改成了8088。
由于新接口根本没找到,也不存在通过日志来定位问题。
对着Tomcat的命令行窗口愣了半天,突然发现:这个Tomcat启动的端口怎么是8099???
8099是之前给测试提供的访问端口,配置了出入站规则的。
可是我明明是将端口改成了8088的呀!

这里说明一下:由于项目切换的缘故,本机一共有四五个Tomcat的拷贝;其中有两个9.0版本的,3个8.0版本的(有一个外购控件使用9.0版本有问题)。其中一个Tomcat9.0用于IDEA内嵌使用,另一个Tomcat9.0是提供了测试访问的。剩下的三个8.0是新近增加的,新的服务配置在了8.0的这几个Tomcat中。
这里写图片描述

这个时候就有点明白了,Tomcat的启动命令虽然调用的是8.0中的startup.bat,但实际上启动的是9.0中的startup.bat。而恰好,这个9.0中也部署了服务A,不过是一个老版本的服务A(有旧接口,新接口那肯定是没有的)。
那至于为什么从8.0中的bat批处理启动了9.0中的Tomcat,这个就要从环境变量上来找原因了。
最开始安装Tomcat的时候,为了方便启动,配置了CATALINA_HOME这个环境变量,而正是这个环境变量,导致了这个巧合的Bug。

追根问底

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

set "EXECUTABLE=%CATALINA_HOME%\bin\catalina.bat"

rem Check that target executable exists
if exist "%EXECUTABLE%" goto okExec
echo Cannot find "%EXECUTABLE%"
echo This file is needed to run this program
goto end
:okExec

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

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

:end

如上,是startup.bat批处理命令中的一段代码,大概翻译一下:
1. 如果CATALINA_HOME环境变量没有定义,将CATALINA_HOM环境变量设置为bat文件的启动目录(这里就是当前目录);
2. 如果CATALINA_HOME不为空,则判断是否存在%CATALINA_HOME%\bin\catalina.bat(即找bin目录下的另一个批处理文件,catalina.bat);否则将CATALINA_HOME设置为当前目录,继续找catalina.bat;
3. 执行catalina.bat启动tomcat;
如此就可以明白,如果设置了CATALINA_HOME这个环境变量,那么无论startup.bat从哪个tomat启动,都会找到环境变量对应目录下的catalina.bat来启动对应的tomcat。

解决办法

解决办法就是:去掉CATALINA_HOME这个环境变量,让各个Tomcat都直接从startup.bat所在的目录启动即可。

回顾整个问题的出现,不得不说有点巧合的成分。但是,也得说是最初配置Tomcat的时候,都是机械地按照网上的步骤来的,没有理解背后的含义。抽空研究一下catalina.bat,看看这个批处理干了点啥。

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值