JBoss重启时Jenkins报java.util.logging.ConsoleHandler未定义错误
问题根因
Handler java.util.logging.ConsoleHandler is not defined报错、构建持续挂起是两个配置错误共同导致的,和JBoss本身服务无关:
- 你自行添加的项目级日志配置存在语法错误,且放置位置不对。JBoss EAP 7.2本身有独立的服务器级日志配置规则,应用WAR包内自带的
logging.properties会被优先加载,覆盖服务器默认配置。你写的handlers = java.util.logging.ConsoleHandler.level= INFO完全不符合java.util.logging配置语法:handlers配置项仅接受Handler类名列表,日志级别是独立配置项,加载时自然找不到对应定义的Handler。 - Jenkins中写的JBoss启动命令存在缺陷,没有让JBoss进程完全脱离构建shell的IO上下文与作业控制:既没有重定向标准输入、标准错误流,也没有将进程从当前shell的作业列表中剥离,导致JBoss JVM直接继承了Jenkins代理进程的JUL日志配置,同时进程的输出句柄被Jenkins持续持有,构建进程永远等不到流关闭信号,就会一直挂起。你在pom中添加Logback依赖无法解决问题,是因为这个报错出现在JBoss服务器启动的早期阶段,还没到加载应用内日志实现的步骤。
修复步骤
按以下顺序操作即可解决问题:
1. 清理无效错误配置
- 删除项目
src/main/resources目录下你自行创建的logging.properties文件,不要在WAR包内自带JUL配置文件,避免覆盖JBoss服务器本身的正确日志配置。 - 如果没有特殊需求必须在应用内使用Logback,直接删掉pom.xml中添加的两个Logback依赖;如果确实要使用Logback作为应用日志实现,需要给两个依赖添加
<scope>provided</scope>标记,同时在WEB-INF目录下新增jboss-deployment-structure.xml文件排除JBoss自带的日志子系统依赖,避免日志实现冲突。
2. 替换Jenkins中的JBoss启动命令
原命令没有完成进程与会话的完全剥离,替换为以下内容:
cd /apps/jboss-eap-7.2/bin # 先终止之前卡住的JBoss进程,避免端口、文件锁占用 if pgrep -f "jboss-eap-7.2/standalone" > /dev/null; then ./jboss-cli.sh --connect command=:shutdown > /dev/null 2>&1 sleep 10 pkill -9 -f "jboss-eap-7.2/standalone" > /dev/null 2>&1 fi # 启动时显式指定JBoss自带的日志配置文件,重定向所有IO流,完全脱离当前shell控制 nohup ./standalone.sh -c standalone-full.xml -b 0.0.0.0 -Djboss.as.management.blocking.timeout=5000 -Djava.util.logging.config.file=/apps/jboss-eap-7.2/standalone/configuration/logging.properties > nohup.out 2>&1 < /dev/null & disown
命令关键调整点:
- 新增
2>&1 < /dev/null完成标准错误、标准输入流的重定向,彻底断开JBoss进程和Jenkins控制台的IO句柄绑定 - 新增
disown命令将JBoss进程从当前shell的作业列表中移除,不会因为构建shell退出导致进程被挂起 - 启动参数中显式指定JBoss服务器自身的
logging.properties路径,强制JVM加载服务器级正确日志配置,避免继承Jenkins代理进程的JUL配置,从根源解决ConsoleHandler未定义的报错。
3. 启动校验
执行完启动命令后,查看nohup.out日志,如果没有JUL相关报错,等待30秒左右访问JBoss服务端口、管理端口验证服务正常即可,此时Jenkins构建不会再持续挂起。
提示:如果需要自定义应用日志规则,直接通过JBoss管理控制台的日志子系统配置即可,不要在应用包内自带全局JUL配置文件,否则每次部署都可能出现日志配置冲突。
内容的提问来源于stack exchange,提问作者vijaya
相关产品推荐
相关产品推荐

