项目场景:
环境: Windows + OpenJDK17 + Tomcat7
背景: 旧项目需要升级jdk,从jdk8升级到openjdk17,升级后系统缺少javax相关包,将javax.jws-api-1.1.jar、jaxb-api-2.3.1.jar、jaxws-api-2.3.1.jar等包引入后,项目编译通过。
问题描述
项目打包放入tomcat后,在bin目录执行startup.bat闪退。
原因分析与问题解决:
此次改动主要修改的是jdk版本,初步判断是jdk版本不同导致的问题。
1.问题定位
startup.bat启动闪退,log目录没有日志文件,要定位问题,就要确定startup脚本执行情况。
在startup.bat文件结尾添加pause
关键字,让脚本执行后窗口暂停。
......
call "%EXECUTABLE%" start %CMD_LINE_ARGS%
:end
rem 添加pause关键字
paruse
执行结果:
依旧闪退,通过打印信息可以看出,jdk已经调整为了openjdk-17.0.7。
使用java -version
命令应该可以看到相同结果:
发现问题,系统环境变量已经调整为jdk17了,tomcat启动信息也表明jdk17已生效,但是上述命令结果仍旧是jdk8。难道是环境变量没保存?
查看环境变量配置:
环境变量配置符合预期,为什么没有生效?
查找资料得知:如果PATH变量中多个路径下都有某个相同命名的可执行文件,从前往后找时找到第一个就会停止。
原文链接:http://www.juzicode.com/computer-basis-path-cmd-search-path/
解决方案: 修改环境变量顺序,将JAVA_HOME上移至第一位:
重新执行java -version命令,结果正常:
本以为问题解决,可启动tomcat时依旧闪退。。。
2.重新定位
tomcat启动执行startup.bat文件后,会去寻找catalina.bat
文件并执行,我们执行catalina.bat文件,看看会不会有新的线索:
可以看到,catalina.bat有多种启动方式,其中:start
参数是默认启动方式,也就是本次闪退的启动方式。
使用debug
参数启动:
系统卡在正在初始化jdb…,没有多余信息。
使用run
参数启动:
这次有了报错信息:-Djava.endorsed.dirs=C:\Program Files\apache-tomcat-7.0.72\endorsed is not supported. Endorsed standards and standalone APIs
查询资料找到官网相关说明:https://docs.oracle.com/javase/10/migrate/toc.htm#JSMIG-GUID-8E83E51A-88A3-4E9A-8E2A-66E1D66A966C
解决方案: 使用推荐的方式,移除catalina.bat脚本中的java.endorsed.dirs
启动参数:
再次使用run
参数启动:
这次启动成功了,但是日志有如下报错:
相信这个问题在jdk升级到9之后大家都遇到过,jdk9之后引入模块化系统,影响了基础包的引用。
解决方案: 添加启动参数(tomcat8之后catalina自带相关配置):
......
rem Configure module start-up parameters
set "JAVA_OPTS=%JAVA_OPTS% --add-opens=java.base/java.lang=ALL-UNNAMED"
set "JAVA_OPTS=%JAVA_OPTS% --add-opens=java.base/java.io=ALL-UNNAMED"
set "JAVA_OPTS=%JAVA_OPTS% --add-opens=java.base/java.util=ALL-UNNAMED"
set "JAVA_OPTS=%JAVA_OPTS% --add-opens=java.base/java.util.concurrent=ALL-UNNAMED"
set "JAVA_OPTS=%JAVA_OPTS% --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED"
添加配置后tomcat启动正常:
至此,此次tomcat闪退问题解决。