如何通过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,不用关心文件名。
- 在EC2上创建软链接:
ln -s /opt/spring-app/latest-app.jar /opt/spring-app/app.jar
- 编写
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
- 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
相关产品推荐
相关产品推荐

