Spring Boot应用多环境打包与Shell自动化部署实践

news2025/6/6 23:53:14
一、多环境配置管理(Profile方案)

推荐方案:通过Maven Profiles实现环境隔离
pom.xml中定义不同环境配置,避免硬编码在application.yml中:

<profiles>
    <!-- 默认环境 -->
    <profile>
        <id>node</id>
        <properties>
            <activeProfile>node</activeProfile>  <!-- 环境标识 -->
            <package-name>${project.artifactId}</package-name>
            <boot-main>com.example.Application</boot-main>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    
    <!-- 其他环境 -->
    <profile>
        <id>node1</id>
        <properties>
            <activeProfile>node1</activeProfile>
            <!-- 其他参数同上 -->
        </properties>
    </profile>
</profiles>

目录结构

src/main/
└── profiles/
    ├── node/     # 默认环境配置
    ├── node1/    # 环境1配置
    └── node2/    # 环境2配置
二、使用assembly-plugin打包发布

目标:生成包含启动脚本、配置文件和依赖的ZIP包

1. Maven插件配置
<build>
    <plugins>
        <!-- 排除配置文件,由assembly单独处理 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <excludes>
                    <exclude>**/*.yml</exclude>
                    <exclude>**/*.properties</exclude>
                </excludes>
            </configuration>
        </plugin>
        
        <!-- 核心打包插件 -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <descriptors>
                    <descriptor>src/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals><goal>single</goal></goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
2. Assembly描述文件 (assembly.xml)
<assembly>
    <id>${activeProfile}</id>
    <formats><format>zip</format></formats>
    <includeBaseDirectory>false</includeBaseDirectory>

    <!-- 依赖库 -->
    <dependencySets>
        <dependencySet>
            <outputDirectory>${package-name}-${activeProfile}/lib</outputDirectory>
            <useProjectArtifact>false</useProjectArtifact>
        </dependencySet>
    </dependencySets>

    <!-- 配置文件 -->
    <fileSets>
        <fileSet>
            <directory>src/main/profiles/${activeProfile}</directory>
            <outputDirectory>${package-name}-${activeProfile}/conf</outputDirectory>
        </fileSet>
        
        <!-- 启动脚本 -->
        <fileSet>
            <directory>src/main/scripts</directory>
            <fileMode>0755</fileMode>
            <filtered>true</filtered>  <!-- 启用变量替换 -->
        </fileSet>
        
        <!-- 应用JAR -->
        <fileSet>
            <directory>target</directory>
            <includes>
                <include>*.jar</include>
            </includes>
            <outputDirectory>${package-name}-${activeProfile}</outputDirectory>
        </fileSet>
    </fileSets>
</assembly>

打包命令

mvn clean package -P node1  # 指定node1环境
三、Shell启动工具详解 (shenniu_publish.sh)

功能:解压、启动、停止、重启应用

核心代码片段:
#!/usr/bin/env bash
# 从Maven接收的参数
baseZipName="${package-name}-${activeProfile}"
packageName="${package-name}"
mainClass="${boot-main}"

# 解压部署包
function unzip_pkg() {
    if [ -f "${baseZipPath}" ]; then
        unzip -o -d ${deployDir} ${baseZipPath}
        chmod +x ${deployDir}/*.sh
    else
        echo "错误:部署包不存在 ${baseZipPath}"
        exit 1
    fi
}

# 启动应用(支持Java/NetCore)
function start_app() {
    # 停止已有进程
    stop_app
    
    cd ${deployDir}
    case "${languageType}" in
        "javac")
            nohup java -cp conf:lib/*:${packageName}.jar ${mainClass} >nohup.out 2>&1 &
        ;;
        "java")
            nohup java -jar ${packageName}.jar >nohup.out 2>&1 &
        ;;
        "netcore")
            nohup ./${packageName} >nohup.out 2>&1 &
        ;;
    esac
    # 检查进程并跟踪日志
    check_pid && tail -f nohup.out
}

# 停止应用
function stop_app() {
    pid=$(pgrep -f "${packageName}")
    [ -n "$pid" ] && kill -9 $pid
}

# 主逻辑
case "$1" in
    "start") start_app ;;
    "stop") stop_app ;;
    "restart") stop_app && start_app ;;
    "deploy") unzip_pkg && start_app ;;
    *) echo "用法: $0 {start|stop|restart|deploy}" ;;
esac
四、Linux部署操作流程
  1. 上传ZIP包至服务器

  2. 执行部署命令

    # 1. 解决Windows格式问题
    vim shenniu_publish.sh
    :set ff=unix  # 转换行尾符
    :wq
    
    # 2. 赋予执行权限
    chmod +x shenniu_publish.sh
    
    # 3. 执行一键部署
    ./shenniu_publish.sh deploy
    
  3. 管理应用状态

    ./shenniu_publish.sh stop     # 停止
    ./shenniu_publish.sh restart  # 重启
    
五、关键要点总结
  1. 环境隔离:通过Maven Profiles实现配置与代码分离
  2. 打包策略
    • 配置文件独立到/conf目录
    • 启动脚本自动赋权(fileMode>755
    • 动态替换脚本中的Maven变量(<filtered>true</filtered>
  3. Shell工具优势
    • 统一管理应用生命周期
    • 支持Java/NetCore多语言
    • 日志自动重定向(nohup.out
  4. 避坑指南
    • Windows编辑的Shell脚本需转换Unix行尾符(:set ff=unix
    • 确保Linux环境有JRE/JDK运行时

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2400702.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【深度学习】14. DL在CV中的应用章:目标检测: R-CNN, Fast R-CNN, Faster R-CNN, MASK R-CNN

深度学习在计算机视觉中的应用介绍 深度卷积神经网络&#xff08;Deep convolutional neural network&#xff0c; DCNN&#xff09;是将深度学习引入计算机视觉发展的关键概念。通过模仿生物神经系统&#xff0c;深度神经网络可以提供前所未有的能力来解释复杂的数据模式&…

UE 材质基础第三天

飘动的旗帜 错乱的贴图排序&#xff0c;创建一个材质函数 可以用在地面材质 体积云材质制作 通过网盘分享的文件&#xff1a;虚幻引擎材质宝典.rar 链接: https://pan.baidu.com/s/1AYRz2V5zQFaitNPA5_JbJw 提取码: cz1q --来自百度网盘超级会员v6的分享

【Github/Gitee Webhook触发自动部署-Jenkins】

Github/Gitee Webhook触发自动部署-Jenkins #mermaid-svg-hRyAcESlyk5R2rDn {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-hRyAcESlyk5R2rDn .error-icon{fill:#552222;}#mermaid-svg-hRyAcESlyk5R2rDn .error-tex…

新松机械臂 2001端口服务的客户端例程

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…

电脑网络重置,找不到原先自家的WIFI,手机还能正常连接并上网

问题排查&#xff1a;1、电脑感觉网络太慢&#xff0c;因此打算点击了网络重置 2、点击提示会删除网络&#xff0c;在五分钟后关机重启 3、从设备管理器设备的无线wifi属性-事件中发现删除记录 4、选择更新驱动程序 5、从列表中选取 6、更改回老驱动版本 备选方案&#…

期末复习(学习)之机器学习入门基础

上课没听过报道。欢迎补充交流&#xff01; 前言&#xff1a;老师画的重点其实可以完全不用看&#xff0c;我这里只是看了一眼书顺着书本敲一遍。 比较干货的部分&#xff0c;直接看学习通的内容就好。最重要的是把学习通的内容记好。 目录 老师划的重点&#xff1a;P50 结构…

网络各类型(BMA,NBMA,P2P)

网络类型—基于二层&#xff08;数据链路层&#xff09;使用的协议不同从而导致数据包封装方式不同&#xff0c;工作方式也有所区别&#xff0c;从而对网络本身进行分类 一、网络类型分类 2. 关键差异对比 1. HDLC&#xff08;高级数据链路控制协议&#xff09; 协议特点&…

【计算机网络】第3章:传输层—概述、多路复用与解复用、UDP

目录 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输&#xff1a;UDP 四、总结 &#xff08;一&#xff09;多路复用与解复用 &#xff08;二&#xff09;UDP 一、概述和传输层服务 二、多路复用与解复用 三、无连接传输&#xff1a;UDP 四、总结 &#xff08…

神经符号AI的企业应用:结合符号推理与深度学习的混合智能

&#x1f4a1; 技术前沿&#xff1a; 神经符号AI代表了人工智能发展的新阶段&#xff0c;它将深度学习的模式识别能力与符号推理的逻辑分析能力有机结合&#xff0c;创造出更加智能、可解释且可靠的AI系统。这种混合智能技术正在重塑企业的智能化应用&#xff0c;从自动化决策到…

VSCode 中 C/C++ 安装、配置、使用全攻略:小白入门指南

引言 本文为Windows系统下安装配置与使用VSCode编写C/C代码的完整攻略&#xff0c;示例机器为Windows11。 通过本文的指导&#xff0c;你可以成功在Windows 机器上上使用VSCode进行C/C开发。 在文章开始之前&#xff0c;你可以先阅读下面这段话&#xff0c;以便于对步骤有个大…

重温经典算法——希尔排序

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本原理 希尔排序是插入排序的改进版&#xff0c;通过按增量分组并逐步缩小增量实现排序。时间复杂度取决于增量序列&#xff0c;平均约为 O(n log n) 到 O(n^(3/2))&…

CortexON:开源的多代理AI系统无缝自动化和简化日常任务

简介 CortexON是一个开源的多代理AI系统&#xff0c;灵感来自Manus和OpenAI DeepResearch等高级代理平台。CortexON旨在无缝自动化和简化日常任务&#xff0c;擅长执行复杂的工作流程&#xff0c;包括全面的研究任务、技术操作和复杂的业务流程自动化。 技术架构 CortexON的技…

海信IP810N-海思MV320芯片-安卓9-2+16G-免拆优盘卡刷固件包

海信IP810N-海思MV320芯片-安卓9-216G-免拆优盘卡刷固件包 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 1.准备一个优盘&#xff0c;最佳是4G&#xff0c;卡刷强刷刷机&#xff0c;用一个usb2.0的8G以下U盘&#xff0c;fat32&#xff0c;2048块单分区格式化…

2025年6月4日收获

Authorization Authorization是一种通用的、标准化的权限控制和认证的通用框架&#xff0c;它能够使跨系统和跨域的身份验证和授权管理更容易&#xff0c;使不同应用程序之间能够更轻松地实现单点登录&#xff08;SSO&#xff09;、用户身份验证和授权控制等。 在前端使用 axi…

leetcode hot100 链表(二)

书接上回&#xff1a; leetcode hot100 链表&#xff08;一&#xff09;-CSDN博客 8.删除链表的倒数第N个结点 class Solution { public:ListNode* removeNthFromEnd(ListNode* head, int n) {ListNode* currhead;int len0;while(curr){currcurr->next;len;}int poslen-n…

6. MySQL基本查询

1. 表的增删改查 Create(创建), Retrieve(读取), Update(更新), Delete(删除) 2. Create & Insert 语法: insert [info] table_name () values () 2.1. 案例: 创建一个学生表 指定列单行插入, 如果values前省略, 则默认是全属性插入多行指定列插入, 中间分隔符为, 3. 插入替…

CMS32M65xx/67xx系列CoreMark跑分测试

CMS32M65xx/67xx系列CoreMark跑分测试 1、参考资料准备 1.1、STM32官方跑分链接 1.2、官网链接 官方移植文档&#xff0c;如下所示&#xff0c;点击红框处-移植文档: A new whitepaper and video explain how to port CoreMark-Pro to bare-metal 1.3、测试软件git下载链接 …

中国区域30m/15天植被覆盖度数据集(2010-2022)

时间分辨率&#xff1a;日空间分辨率&#xff1b;&#xff1a;10m - 100m共享方&#xff1a;式开放获取数据大小&#xff1a;2.98 TB数据时间范围&#xff1a;2010-01-01 — 2022-12-31元数据更新时间&#xff1a;2024-12-23 数据集摘要 高时空分辨率的植被覆盖度产品存在着广…

力扣HOT100之二分查找:74. 搜索二维矩阵

这道题直接a了&#xff0c;我们可以参考上一道题&#xff1a;35.搜索插入位置的思路&#xff0c;详情见我的上一篇博客。将每一行的第一个元素当作一个数组中的元素&#xff0c;然后对这个数组进行二分查找&#xff0c;如果直接找到了target&#xff0c;则直接返回true&#xf…

编程技能:格式化打印04,sprintf

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;编程技能&#xff1a;格式化打印03&#xff0c;printf 回到目录…