打包和部署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是一个在线编程网站,提供各种算法和数据结构的题目&…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...
02.运算符
目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&:逻辑与 ||:逻辑或 !:逻辑非 短路求值 位运算符 按位与&: 按位或 | 按位取反~ …...
