打包和部署Java应用程序:Maven和Shell脚本的实用方法
在软件开发领域,高效打包和分发Java应用程序是至关重要的。本博客将探讨一种使用Maven插件和Shell脚本的简化方法,以创建一个分发包,其中包含了您项目的可执行JAR文件、配置文件和一个方便的启动脚本。
步骤1:Maven插件配置
旅程从Maven开始,这是Java生态系统中广泛使用的强大构建工具。我们利用maven-assembly-plugin配置我们项目的打包。以下是pom.xml文件中的相关配置:
<!-- Maven Assembly Plugin 配置 -->
<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><version>3.6.0</version><executions><execution><id>create-zip</id><phase>package</phase><goals><goal>single</goal></goals><configuration><descriptors><descriptor>src/main/assembly/zip.xml</descriptor></descriptors><!-- 禁止追加程序集ID,以获得更清晰的文件名 --><appendAssemblyId>false</appendAssemblyId><archive><!-- 为JAR清单指定主类 --><manifest><mainClass>com.demo.workhookpushweixin.WorkHookPushWeixinApplication</mainClass></manifest></archive></configuration></execution></executions>
</plugin>
该配置指示Maven在package阶段执行汇编插件,利用zip.xml中定义的设置。
mainClass 就是Spring Boot应用的主类,原有的 spring-boot-maven-plugin 不能删除
步骤2:assembly插件配置文件
zip.xml文件位于src/main/assembly/目录中,概述了分发包的结构。它指定了ZIP文件中应包含的组件:
<assembly><id>zip</id><formats><format>zip</format></formats><fileSets><!-- 包含JAR文件 --><fileSet><directory>${project.build.directory}</directory><outputDirectory>/</outputDirectory><includes><include>*.jar</include></includes></fileSet><!-- 包含启动脚本 --><fileSet><directory>src/main/scripts</directory><outputDirectory>/</outputDirectory><includes><include>spring-boot-control.sh</include></includes><filtered>true</filtered><fileMode>0755</fileMode></fileSet><!-- 包含配置文件 --><fileSet><directory>src/main/resources</directory><outputDirectory>/</outputDirectory><includes><include>*.yml</include></includes></fileSet></fileSets>
</assembly>
该文件定义了汇编结构,确保JAR文件、启动脚本和配置文件以期望的方式组织在一起。
步骤3:启动脚本
为了将所有东西串联在一起,提供了一个Bash脚本(src/main/scripts/spring-boot-control.sh)来管理应用程序。让我们分解关键功能:
#!/bin/bash# APP_NAME:定义Java应用程序JAR文件的名称。
APP_NAME=${artifactId}-${version}.jar# LOG_FILE:指定存储应用日志的文件名。
LOG_FILE=app.log# JAVA_OPTS:用于传递应用程序所需的任何Java选项。
# 这目前为空,但可以根据需要进行配置。
JAVA_OPTS=""# 函数# start():如果应用程序尚未运行,则启动它。
# 使用 'nohup' 在后台运行进程,并将输出重定向到日志文件。
start() {if [ $(is_running) -eq 1 ]; thenecho "应用程序已在运行。"elsenohup java -jar $APP_NAME $JAVA_OPTS > $LOG_FILE 2>&1 &echo "应用程序已启动。"fi
}# stop():如果应用程序正在运行,则停止它。
# 首先尝试使用 'SIGTERM' 优雅地停止应用程序,如果失败,则使用 'kill -9' 强制停止。
stop() {PID=$(get_pid)if [ -z "$PID" ]; thenecho "应用程序已停止。"elseecho "正在停止应用程序..."kill -SIGTERM $PIDsleep 5if [ $(is_running) -eq 1 ]; thenecho "正在强制停止应用程序..."kill -9 $PIDfiecho "应用程序已停止。"fi
}# log():实时显示日志文件的内容。
log() {tail -f $LOG_FILE
}# status():检查应用程序当前是否在运行。
status() {if [ $(is_running) -eq 1 ]; thenecho "应用程序正在运行。"elseecho "应用程序已停止。"fi
}# get_pid():检索应用程序的进程ID(PID)。
get_pid() {echo $(ps -ef | grep $APP_NAME | grep -v grep | awk '{ print $2 }')
}# is_running():根据PID的存在来确定应用程序当前是否在运行。
is_running() {if [ -z "$(get_pid)" ]; thenecho 0elseecho 1fi
}# 主执行逻辑
# 处理命令行参数以执行相应的函数。
# 支持的命令:start, stop, log, status。
# 对于无效命令显示使用信息。
case $1 instart)start;;stop)stop;;log)log;;status)status;;*)echo "使用方法:$0 {start|stop|log|status}"echo "start:启动应用程序"echo "stop:停止应用程序"echo "log:查看应用程序日志"echo "status:检查应用程序是否在运行"exit 1
esac
在脚本中,我们定义了几个函数以及一个主函数,用于启动、停止、查看日志和检查应用程序状态:
- start: 启动应用程序,使用
nohup使应用在后台运行,并将输出重定向到一个日志文件。 - stop: 停止应用程序,首先通过
get_pid函数获取应用程序的进程ID,然后使用kill命令发送信号以停止应用程序。 - log: 查看应用程序的日志,使用
tail -f命令实时监视日志文件。 - status: 检查应用程序的运行状态,通过检查进程ID的存在与否来判断应用程序是否正在运行。
整个思路是通过Maven插件将项目的关键文件和配置打包成一个ZIP文件,然后提供一个Shell脚本来管理应用程序的启动和停止。这种方式使得应用程序的部署和管理变得更加方便,尤其适用于一些需要分发给其他环境的应用程序。同时,通过Shell脚本提供的功能,可以更方便地监控应用程序的运行状态和查看日志,提高了部署后的维护性。
相关文章:
打包和部署Java应用程序:Maven和Shell脚本的实用方法
在软件开发领域,高效打包和分发Java应用程序是至关重要的。本博客将探讨一种使用Maven插件和Shell脚本的简化方法,以创建一个分发包,其中包含了您项目的可执行JAR文件、配置文件和一个方便的启动脚本。 步骤1:Maven插件配置 旅程…...
Windows Python3安装salt模块失败处理
复现CVE-2020-11651时候运行CVE-2020-11651的poc时候需要salt模块 在下载时出现了错误 尝试在网上寻找解决方法: 1.更新 setuptools 和 wheel pip install --upgrade setuptools wheel 2. 安装Microsoft Visual C 14.0 因为salt模块包包使用了 C/C 扩展&#x…...
RabbitMQ 消息队列编程
安装与配置 安装 RabbitMQ 读者可以在 RabbitMQ 官方文档中找到完整的安装教程:Downloading and Installing RabbitMQ — RabbitMQ 本文使用 Docker 的方式部署。 RabbitMQ 社区镜像列表:https://hub.docker.com/_/rabbitmq 创建目录用于映射存储卷…...
基于安卓android微信小程序的个人管理小程序
运行环境 开发语言:Java 框架:ssm JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包&a…...
免费图书教材配套资料:Spark大数据技术与应用(第2版)
《Spark大数据技术与应用(第2版)》课程内容全面介绍了Spark大数据技术的相关知识,内容包含包括Spark概述、Scala基础、Spark编程、Spark编程进阶、Spark SQL结构化数据文件处理、Spark Streaming实时计算框架、Spark GraphX图计算框架、Spark…...
SecureCRT9汉化版安装
CRT中文版安装说明 一、安装步骤1. 安装注意:2. 右键压缩包,解压到本地文件夹内3. 解压后进入目录,双击CRT_SFX_91_Run_Script激活脚本 3 如果运行结果是下图,就激活成功了:4. 双击桌面的CRT和FX图标5. 如果提示下图,,点击总是忽略即可6. 第一次安装CRT会出现下图,让你…...
【VSCode】VSCode 使用
目录 文章目录 目录插件配置设置代码不显示 git 提示 "xxx months ago | 1 author"设置打开项目不自动选择 CMakeLists 插件 以下插件为 C 开发偏好设置。 C/CCMakeCMake ToolsGitLensRemote DevelopmentRemote Explorer 配置 设置代码不显示 git 提示 “xxx mon…...
【ARM 嵌入式 编译系列 2.2 -- 如何在Makefile 中添加编译时间 | 编译作者| 编译 git id】
请阅读【ARM GCC 编译专栏导读】 上篇文章:【ARM 嵌入式 编译系列 2.1 – GCC 编译参数学习】 下篇文章:【ARM 嵌入式 编译系列 2.3 – GCC 中指定 ARMv8-M 的 Thumb 指令集参数详细介绍】 文章目录 编译参数介绍 编译参数介绍 通常我们在 OS 启动的时…...
海康威视监控相机的SDK与opencv调用(非工业相机)
1.研究内容 本篇主要对海康威视的监控相机的SDK回调进行研究,并于opencv结合,保存图像,以供后续其他处理,开发语言为C 2.步骤及方法 2.1 海康SDK介绍 海康SDK下载地址 根据自身编译环境,下载对应的SDK,需要注意的是…...
VUE项目部署过程中遇到的错误:POST http://124.60.11.183:9090/test/login 405 (Not Allowed)
我当初报了这个405错误,再网上查了半天,他们都说什么是nginx部署不支持post访问静态资源。 但后面我发现我是因为另一个原因才导致的无法访问。 我再vue中有使用devServer:{ proxy:{} }进行路由转发。 但是!! 在这个配置只…...
MongoDB——索引(单索引,复合索引,索引创建、使用)
MongoDB索引 官方文档 https://docs.mongodb.com/manual/indexes/#create-an-index 默认索引 _id index Mongodb 在 collection 创建时会默认建立一个基于_id 的唯一性索引作为 document 的 primarykey,这个 index 无法被删除 单个字段索引 单字段索引是 Mongo…...
ebpf实战(一)-------监控udp延迟
问题背景: 为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段. udp接收端有2个主要路径 1.数据包到达本机后,由软中断处理程序将数据包接收并放入udp socket的接收缓冲区 数据接收流程 2. 应用程序调用recvmsg等a…...
中西部各省市翻译协会、公关协会会长金秋圆桌会议圆满结束
中西部翻译协会共同体、中西部公共关系协会共同体共同体创建8年来,已成功举办了八届翻译大赛。时值第九届中西部翻译大赛将拉开序幕,中西部翻译协会共同体、中西部公共关系协会共同体举办的2023年度中西部各省市翻译协会、公关协会会长金秋圆桌会议&…...
极盾故事|“五步”构建某三甲医院数据安全管理集成平台
极盾科技助力某三甲医院,构建统一的数据安全管理集成平台,最终实现: 1、数据安全管理的自动化,覆盖全院医教研管15个应用场景、14项管理活动、300+项数据,完成40+个重要信息系统的自动监控、风…...
【开题报告】基于uni-app的恋爱打卡app的设计与实现
1.选题背景 如今,随着移动互联网的普及和人们对生活品质的追求,恋爱已经成为了许多人关注的焦点。然而,在恋爱过程中,由于种种原因,往往会忽略掉一些重要的时刻和细节,导致感情降温甚至破裂。因此…...
Python 2.7 在 Debian 服务器上获取 URL 时的 SSL 验证失败问题与解决方案
在使用Python的requests库从Debian稳定服务器上获取简单URL时,遇到了SSL证书错误。 根据用户的问题描述,您遇到了SSL证书验证失败的问题。 要解决这个问题,您可以采取以下步骤: 1. 升级到Python 2.7的最新版本: 首…...
导出文件到指定路径??
需求:点击导出pdf按钮,弹出系统文件夹弹框,可以选择保存文件的位置。 经查询window.showSaveFilePicker可实现,但这个api处于实验阶段,且用下来确实和浏览器类型、浏览器版本、以及本身api就不稳定有关系。 代码见下…...
腾讯微服务平台TSF学习笔记(二)--如何使用spring cloud zuul实现线上流量复制
需求提了n遍了,好好好,那这个需求就由我测试来做 1.在zuul端配置: ●假设provider-mirror是provider-demo的灰度应用 package com.tencent.tsf.msgw.zuul1.filter;import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.Re…...
React自定义Hook之useRequest
一、简介 通过自定义hook,实现对http请求封装。 支持loading状态判断请求进度,支持获取请求正确和错误结果。 二、技术方案 use request hook export const useRequest (options) > {// 请求参数const [url, ...init] options;// 请求返回的数…...
【LeetCode】挑战100天 Day13(热题+面试经典150题)
【LeetCode】挑战100天 Day13(热题面试经典150题) 一、LeetCode介绍二、LeetCode 热题 HOT 100-152.1 题目2.2 题解 三、面试经典 150 题-153.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站,提供各种算法和数据结构的题目&…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...
基于Docker Compose部署Java微服务项目
一. 创建根项目 根项目(父项目)主要用于依赖管理 一些需要注意的点: 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件,否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...
