You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins执行Jar包Web应用时冻结,如何绕过无浏览器异常?

解决Jenkins中执行Java Jar包时“No web browser found”导致任务冻结的问题

问题描述

我在Jenkins流水线中执行java -jar app.jar启动Web应用,准备后续跑Selenoid UI测试时遇到了异常:

2024-11-18 13:54:16,203 [main] [INFO] () [r.s.c.w.a.RemoteApplication]: Started RemoteApplication in 4.282 seconds (JVM running for 4.498)
2024-11-18 13:54:16,248 [main] [WARN] () [r.s.c.w.r.SimpleUrlBrowser]: Please open the following address in your browser:
2024-11-18 13:54:16,249 [main] [WARN] () [r.s.c.w.r.SimpleUrlBrowser]: http://localhost:20080
java.lang.Exception: No web browser found

之后Jenkins任务直接无限冻结,必须手动终止。我的流水线流程是:

  1. 从远程服务器curl获取Jar包
  2. 执行java -jar app.jar
  3. 启动Selenoid UI测试
  4. 停止任务
    请问有没有办法绕过这个异常正常运行Jar包?

可行解决方案

1. 禁用Jar包自动打开浏览器

你的Jar包启动后会尝试调用本地浏览器打开应用地址,但Jenkins节点(尤其是无头运行的环境)没有安装浏览器,导致抛出异常并阻塞进程。可以通过JVM参数直接禁用这个行为:

java -Djava.awt.headless=true -jar app.jar

如果应用本身有自定义配置项控制浏览器启动(比如部分Spring Boot应用的server.browser.open=false),也可以直接传递参数:

java -jar app.jar --server.browser.open=false

2. 后台启动Jar包(避免阻塞流水线)

即使解决了浏览器问题,直接执行java -jar app.jar会让Jenkins进程一直等待Jar包进程结束,导致流水线卡住。需要把Jar包放到后台运行:

nohup java -Djava.awt.headless=true -jar app.jar > app.log 2>&1 &
  • nohup:让进程脱离终端会话,即使Jenkins的Shell结束也能继续运行
  • > app.log 2>&1:把标准输出和错误输出重定向到日志文件,方便后续排查问题
  • &:让进程在后台运行,释放Jenkins的Shell进程继续执行后续步骤

3. 等待应用就绪后再执行Selenoid测试

Jar包启动需要时间初始化,直接跑测试会因为应用未就绪而失败。可以添加轮询逻辑等待应用启动完成:

# 轮询健康检查接口,最多等待60秒
for i in {1..60}; do
  if curl -s http://localhost:20080/actuator/health | grep -q "UP"; then
    echo "应用已启动完成"
    break
  fi
  sleep 1
done

如果没有健康检查接口,也可以通过端口连通性判断:

while ! nc -z localhost 20080; do
  sleep 1
done

4. 流水线结束时终止Jar包进程

因为Jar包是后台运行的,流水线结束后需要手动杀死进程,避免占用节点资源:

# 通过端口号查找并杀死进程
kill $(lsof -t -i:20080)
# 或者通过Jar包名称查找
kill $(ps aux | grep app.jar | grep -v grep | awk '{print $2}')

内容的提问来源于stack exchange,提问作者rustCohle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 03:34:59