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

如何通过Jenkins部署Spring Boot Jar至EC2并处理文件名可变的持续部署

我完全懂你这种困扰——好不容易把Spring Boot部署到EC2的流程摸顺了,结果Jenkins持续部署卡在Jar文件名/应用名变化的问题上,每次版本更新都要改流水线代码,太折腾了。我来给你几个实用的解决思路:

方案1:让Maven打包出固定文件名的Jar

最直接的办法是修改pom.xml,强制打包后的Jar使用固定名称,不管版本号怎么变都不变。在build节点里添加finalName配置:

<build>
    <!-- 指定最终Jar文件名,不带版本号 -->
    <finalName>my-spring-app</finalName>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

这样打包后,target目录下只会生成my-spring-app.jar,Jenkins流水线里直接写死这个路径就行,再也不用管版本变化导致的文件名问题。

方案2:在Jenkins流水线里动态捕获Jar路径

如果不想改动pom.xml,可以在Jenkins里用脚本动态找到最新生成的可执行Jar(注意排除Spring Boot打包时生成的original-*.jar,那个是未经优化的原始Jar)。修改你的流水线代码,添加变量存储Jar路径:

pipeline {
    agent any
    tools{ maven 'localmaven' }
    // 定义全局变量存储Jar文件路径
    environment {
        APP_JAR = ''
    }
    stages {
        stage('Build') {
            steps {
                sh 'mvn clean package'
                script {
                    // 用find命令找到target下的可执行Jar,排除original开头的文件
                    APP_JAR = sh(
                        script: "find target -name '*.jar' ! -name 'original-*.jar' | head -n 1",
                        returnStdout: true
                    ).trim()
                    echo "找到待部署的Jar文件:${APP_JAR}"
                }
            }
        }
        stage('Deploy to EC2') {
            steps {
                // 后续部署步骤都用APP_JAR变量,比如scp到EC2
                sh "scp ${APP_JAR} ec2-user@你的EC2实例IP:/opt/spring-app/"
                // 重启EC2上的应用服务(假设用systemd管理)
                sh "ssh ec2-user@你的EC2实例IP 'sudo systemctl restart spring-app.service'"
            }
        }
    }
    post {
        success {
            echo 'Now Archiving...'
            // 归档时也用变量,避免硬编码
            archiveArtifacts artifacts: "${APP_JAR}", fingerprint: true
        }
    }
}

这个方法的好处是完全兼容现有Maven配置,不管你怎么改应用名、版本号,Jenkins都能自动找到正确的Jar文件。

方案3:EC2端用软链接+Systemd统一管理

在EC2服务器上,不要直接运行Jar文件,而是用systemd服务配合软链接来管理,这样Jenkins只需要上传最新的Jar,不用关心文件名。

  1. 在EC2上创建软链接:
ln -s /opt/spring-app/latest-app.jar /opt/spring-app/app.jar
  1. 编写systemd服务文件/etc/systemd/system/spring-app.service:
[Unit]
Description=我的Spring Boot应用
After=network.target

[Service]
User=ec2-user
# 这里指向软链接,不用管实际Jar文件名
ExecStart=/usr/bin/java -jar /opt/spring-app/app.jar
Restart=always # 应用崩溃自动重启

[Install]
WantedBy=multi-user.target
  1. Jenkins部署时,只需要把新Jar上传到/opt/spring-app/latest-app.jar,然后重启服务:
// 在Deploy阶段的步骤
sh "scp ${APP_JAR} ec2-user@你的EC2实例IP:/opt/spring-app/latest-app.jar"
sh "ssh ec2-user@你的EC2实例IP 'sudo systemctl daemon-reload && sudo systemctl restart spring-app.service'"

这样不管Jenkins上传的Jar文件名是什么,软链接都会指向最新的版本,systemd服务始终运行同一个路径的Jar,彻底解决文件名变化的问题。

你可以根据自己的实际情况选择其中一个方案,或者组合使用——比如先用方案2动态捕获Jar,再用方案3的软链接+Systemd管理,这样不管前端怎么改,后端部署都能稳定运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:26:21