首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >【实战干货】Jenkins部署后项目启动总报“找不到类”?一招MD5校验,解决JAR传输不完整问题

【实战干货】Jenkins部署后项目启动总报“找不到类”?一招MD5校验,解决JAR传输不完整问题

作者头像
Python运维开发
发布2025-09-29 14:13:53
发布2025-09-29 14:13:53
1110
举报
文章被收录于专栏:Python运维开发Python运维开发

最近项目上线遇到一个奇怪问题:服务启动时报 ClassNotFoundException,但重启一下又好了! 一开始以为是偶然

经过排查,怀疑是 JAR包在传输过程中未完全传输完成,服务就启动了,导致java类加载失败。

为了解决这个问题,我在 Jenkins Pipeline 中加了MD5 校验机制,确保 JAR 包完整传输后才继续部署。


问题背景:为什么重启就正常了?

  • 现象:多次发现发布后,部分节点报错“找不到某个类”,但手动重启服务后恢复正常。
  • 怀疑:文件传输完全未完成,服务就启动了。
  • 原因:网络波动、大文件传输、Jenkins步骤未等待传输完全完成。

解决方案:在启动服务前,校验源文件与目标文件的 MD5 值是否一致,不一致就等待重试。


Jenkins Pipeline 代码

下面是 Jenkins Pipeline 脚本,

思路是:

  1. 获取jenkins服务器 JAR 包的 MD5
  2. 检查发送到部署服务器 JAR 包 MD5
  3. 比对是否一致,如不一致?重试,超过阈值推出

Pipeline 脚本

代码语言:javascript
复制
stage("Jar Files Check") {
    steps {
        script {
            def sMd5 = sh(
                script: "ssh ${host} 'md5sum ${APP_SEND_PATH}/datacenter-${projectname}.jar' | awk '{print \$1}'",
               returnStdout: true
            ).trim()
            echo " 源文件 MD5: ${sMd5}"
            for (tHost : HOSTS) {
                stage("MD5 Check on ${tHost}") {
                    mRetries = 6
                    rCount = 0
                    boolean isOk = false
                    while (rCount < mRetries && !isOk) {
                        try {
                            def tMd5 = sh(
                                script: "ssh ${host} 'ssh ${tHost} md5sum ${Deploy_PATH}/datacenter-${projectname}.jar' | awk '{print \$1}'",
                                returnStdout: true
                            ).trim()
                            echo "${tHost} 当前 MD5: ${tMd5}"
                            if (sMd5 == tMd5) {
                                echo "${tHost}: JAR 传输完成,MD5 校验通过!"
                                isOk = true
                            } else {
                                echo "${tHost}: JAR 传输未完成,等待 10 秒重试..."
                                sleep(time: 10, unit: "SECONDS")
                                rCount++
                            }
                        } catch (Exception e) {
                            echo "${tHost}: 获取 MD5 失败: ${e}"
                            rCount++
                            sleep(time: 10, unit: "SECONDS")
                        }
                    }
                    if (!isOk) {
                        error "${tHost}: JAR 校验失败,已重试 ${mRetries} 次推出"
                    }
                }
            }
        }
    }
}

如果加了验证以后还报错呢?

我在测试环境还真遇到过这个问题,由于是测试环境,经常资源饱和甚至不足导致 重启时服务器卡导致上一个进程未被kill掉, 新的进程起来后端口被占用未完全启动, 手动将上一次进程kill掉--问题解决

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python运维开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题背景:为什么重启就正常了?
  • Jenkins Pipeline 代码
    • Pipeline 脚本
  • 如果加了验证以后还报错呢?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档