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任务直接无限冻结,必须手动终止。我的流水线流程是:
- 从远程服务器curl获取Jar包
- 执行
java -jar app.jar- 启动Selenoid UI测试
- 停止任务
请问有没有办法绕过这个异常正常运行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
相关产品推荐
相关产品推荐

