Tomcat 8.5.31部署单个WAR包时卡住无日志输出求助
Tomcat 8.5部署WAR包启动卡住无日志输出的排查方案
这种情况我之前在项目迁移中碰到好多次了——从Tomcat 7升级到8.5后,大部分WAR包正常,但有一个卡在部署启动环节,连日志都没后续输出。别着急,咱们一步步排查:
1. 调大日志级别,抓取隐藏的细节
默认的Tomcat日志级别太粗,可能没记录到部署过程中的关键细节:
- 打开Tomcat的
conf/logging.properties,把org.apache.catalina.level改成FINE,对应的java.util.logging.ConsoleHandler.level也设为FINE,这样控制台会输出类加载、Servlet初始化等更细粒度的日志。 - 别忘了检查应用自身的日志文件!很多应用会把日志输出到
webapps/llas/WEB-INF/logs目录下,而非Catalina.out,说不定那里藏着启动失败的具体原因。
2. 导出线程栈,排查阻塞或死锁
这是最关键的一步,当应用卡住时,立刻执行以下命令导出JVM线程状态:
# 先找到Tomcat进程ID ps aux | grep tomcat # 导出线程栈到文件 jstack <你的Tomcat进程ID> > thread_dump.txt
打开thread_dump.txt,重点关注localhost-startStop-1线程(就是日志里负责部署WAR的线程):
- 如果它处于
BLOCKED状态,查看它在等待哪个锁,再定位持有该锁的线程,大概率是死锁或依赖资源未就绪(比如数据库连接池卡住等待数据库响应)。 - 如果是
WAITING状态,检查它在等待的条件,比如是否在等外部服务返回、异步任务完成等。
3. 排查Tomcat 8.5与应用的兼容性问题
Tomcat 8.5相对于7有不少升级,比如Servlet API到3.1、EL表达式行为变化、自带类库版本更新,很容易出现兼容性问题:
- 检查应用WAR包内是否包含与Tomcat自带冲突的类库,比如
javax.servlet-api.jar、jsp-api.jar,这些类库应由Tomcat提供,应用打包进去会导致类加载混乱,直接卡住。 - 检查应用初始化代码,比如
ServletContextListener或Spring启动监听器,有没有依赖Tomcat 7的内部API(比如org.apache.catalina下的某些类),这些在Tomcat 8中可能已被移除或修改。
4. 检查外部资源依赖
应用启动时通常会连接数据库、缓存或其他服务,如果这些服务未启动、网络不通,或连接超时设置过长,就会看起来像卡住:
- 临时将外部依赖换成本地测试服务(比如用H2代替MySQL),或直接注释相关初始化代码,看应用能否正常启动,以此排除外部资源问题。
5. 手动解压WAR包尝试部署
有时候WAR包压缩格式有问题,或Tomcat解压时遇到权限问题,也会导致卡住:
- 手动将
llas.war解压到webapps/llas目录下,重启Tomcat,说不定会输出更明确的错误信息。
以下是你提供的Catalina.out最后部分的日志:
23-May-2018 04:14:55.314 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version: Apache Tomcat/8.5.31 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built: Apr 27 2018 20:24:25 UTC 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server number: 8.5.31.0 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name: Linux 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version: 3.10.0-693.21.1.el7.x86_64 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture: amd64 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home: /usr/java/jdk1.8.0_60/jre 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version: 1.8.0_60-b27 23-May-2018 04:14:55.328 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor: Oracle Corporation 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE: /opt/apache-tomcat-8.5.31 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME: /opt/apache-tomcat-8.5.31 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/opt/tomcat/conf/logging.properties 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources 23-May-2018 04:14:55.329 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs= 23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/opt/tomcat 23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/opt/tomcat 23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/opt/tomcat/temp 23-May-2018 04:14:55.330 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: [/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib] 23-May-2018 04:14:55.644 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"] 23-May-2018 04:14:55.675 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 23-May-2018 04:14:55.706 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["ajp-nio-8009"] 23-May-2018 04:14:55.708 INFO [main] org.apache.tomcat.util.net.NioSelectorPool.getSharedSelector Using a shared selector for servlet write/read 23-May-2018 04:14:55.720 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1282 ms 23-May-2018 04:14:55.755 WARNING [main] org.apache.tomcat.jdbc.pool.ConnectionPool.checkPoolConfiguration maxIdle is smaller than minIdle, setting maxIdle to: 5 23-May-2018 04:14:57.653 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina] 23-May-2018 04:14:57.654 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet Engine: Apache Tomcat/8.5.31 23-May-2018 04:14:57.711 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/opt/apache-tomcat-8.5.31/webapps/llas.war]
内容的提问来源于stack exchange,提问作者sachin thakur
相关产品推荐
相关产品推荐

