当前位置: 首页 > news >正文

打包和部署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脚本的实用方法

在软件开发领域&#xff0c;高效打包和分发Java应用程序是至关重要的。本博客将探讨一种使用Maven插件和Shell脚本的简化方法&#xff0c;以创建一个分发包&#xff0c;其中包含了您项目的可执行JAR文件、配置文件和一个方便的启动脚本。 步骤1&#xff1a;Maven插件配置 旅程…...

Windows Python3安装salt模块失败处理

复现CVE-2020-11651时候运行CVE-2020-11651的poc时候需要salt模块 在下载时出现了错误 尝试在网上寻找解决方法&#xff1a; 1.更新 setuptools 和 wheel pip install --upgrade setuptools wheel 2. 安装Microsoft Visual C 14.0 因为salt模块包包使用了 C/C 扩展&#x…...

RabbitMQ 消息队列编程

安装与配置 安装 RabbitMQ 读者可以在 RabbitMQ 官方文档中找到完整的安装教程&#xff1a;Downloading and Installing RabbitMQ — RabbitMQ 本文使用 Docker 的方式部署。 RabbitMQ 社区镜像列表&#xff1a;https://hub.docker.com/_/rabbitmq 创建目录用于映射存储卷…...

基于安卓android微信小程序的个人管理小程序

运行环境 开发语言&#xff1a;Java 框架&#xff1a;ssm JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&a…...

免费图书教材配套资料:Spark大数据技术与应用(第2版)

《Spark大数据技术与应用&#xff08;第2版&#xff09;》课程内容全面介绍了Spark大数据技术的相关知识&#xff0c;内容包含包括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 编译专栏导读】 上篇文章&#xff1a;【ARM 嵌入式 编译系列 2.1 – GCC 编译参数学习】 下篇文章&#xff1a;【ARM 嵌入式 编译系列 2.3 – GCC 中指定 ARMv8-M 的 Thumb 指令集参数详细介绍】 文章目录 编译参数介绍 编译参数介绍 通常我们在 OS 启动的时…...

海康威视监控相机的SDK与opencv调用(非工业相机)

1.研究内容 本篇主要对海康威视的监控相机的SDK回调进行研究&#xff0c;并于opencv结合&#xff0c;保存图像,以供后续其他处理&#xff0c;开发语言为C 2.步骤及方法 2.1 海康SDK介绍 海康SDK下载地址 根据自身编译环境&#xff0c;下载对应的SDK&#xff0c;需要注意的是…...

VUE项目部署过程中遇到的错误:POST http://124.60.11.183:9090/test/login 405 (Not Allowed)

我当初报了这个405错误&#xff0c;再网上查了半天&#xff0c;他们都说什么是nginx部署不支持post访问静态资源。 但后面我发现我是因为另一个原因才导致的无法访问。 我再vue中有使用devServer:{ proxy:{} }进行路由转发。 但是&#xff01;&#xff01; 在这个配置只…...

MongoDB——索引(单索引,复合索引,索引创建、使用)

MongoDB索引 官方文档 https://docs.mongodb.com/manual/indexes/#create-an-index 默认索引 _id index Mongodb 在 collection 创建时会默认建立一个基于_id 的唯一性索引作为 document 的 primarykey&#xff0c;这个 index 无法被删除 单个字段索引 单字段索引是 Mongo…...

ebpf实战(一)-------监控udp延迟

问题背景: 为了分析udp数据通信中端到端的延迟,我们需要对整个通信链路的每个阶段进行监控,找出延迟最长的阶段. udp接收端有2个主要路径 1.数据包到达本机后&#xff0c;由软中断处理程序将数据包接收并放入udp socket的接收缓冲区 数据接收流程 2. 应用程序调用recvmsg等a…...

中西部各省市翻译协会、公关协会会长金秋圆桌会议圆满结束

中西部翻译协会共同体、中西部公共关系协会共同体共同体创建8年来&#xff0c;已成功举办了八届翻译大赛。时值第九届中西部翻译大赛将拉开序幕&#xff0c;中西部翻译协会共同体、中西部公共关系协会共同体举办的2023年度中西部各省市翻译协会、公关协会会长金秋圆桌会议&…...

极盾故事|“五步”构建某三甲医院数据安全管理集成平台

极盾科技助力某三甲医院&#xff0c;构建统一的数据安全管理集成平台&#xff0c;最终实现&#xff1a; 1、数据安全管理的自动化&#xff0c;覆盖全院医教研管15个应用场景、14项管理活动、300&#xff0b;项数据&#xff0c;完成40&#xff0b;个重要信息系统的自动监控、风…...

【开题报告】基于uni-app的恋爱打卡app的设计与实现

1.选题背景 如今&#xff0c;随着移动互联网的普及和人们对生活品质的追求&#xff0c;恋爱已经成为了许多人关注的焦点。然而&#xff0c;在恋爱过程中&#xff0c;由于种种原因&#xff0c;往往会忽略掉一些重要的时刻和细节&#xff0c;导致感情降温甚至破裂。因此&#xf…...

Python 2.7 在 Debian 服务器上获取 URL 时的 SSL 验证失败问题与解决方案

在使用Python的requests库从Debian稳定服务器上获取简单URL时&#xff0c;遇到了SSL证书错误。 根据用户的问题描述&#xff0c;您遇到了SSL证书验证失败的问题。 要解决这个问题&#xff0c;您可以采取以下步骤&#xff1a; 1. 升级到Python 2.7的最新版本&#xff1a; 首…...

导出文件到指定路径??

需求&#xff1a;点击导出pdf按钮&#xff0c;弹出系统文件夹弹框&#xff0c;可以选择保存文件的位置。 经查询window.showSaveFilePicker可实现&#xff0c;但这个api处于实验阶段&#xff0c;且用下来确实和浏览器类型、浏览器版本、以及本身api就不稳定有关系。 代码见下…...

腾讯微服务平台TSF学习笔记(二)--如何使用spring cloud zuul实现线上流量复制

需求提了n遍了&#xff0c;好好好&#xff0c;那这个需求就由我测试来做 1.在zuul端配置&#xff1a; ●假设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&#xff0c;实现对http请求封装。 支持loading状态判断请求进度&#xff0c;支持获取请求正确和错误结果。 二、技术方案 use request hook export const useRequest (options) > {// 请求参数const [url, ...init] options;// 请求返回的数…...

【LeetCode】挑战100天 Day13(热题+面试经典150题)

【LeetCode】挑战100天 Day13&#xff08;热题面试经典150题&#xff09; 一、LeetCode介绍二、LeetCode 热题 HOT 100-152.1 题目2.2 题解 三、面试经典 150 题-153.1 题目3.2 题解 一、LeetCode介绍 LeetCode是一个在线编程网站&#xff0c;提供各种算法和数据结构的题目&…...

微信小程序 - 手机震动

一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注&#xff1a;文档 https://developers.weixin.qq…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下&#xff0c;江苏艾立泰以一场跨国资源接力的创新实践&#xff0c;重新定义了绿色供应链的边界。 跨国回收网络&#xff1a;废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点&#xff0c;将海外废弃包装箱通过标准…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

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的内容&#xff0c;使用AI&#xff08;2025&#xff09;可以参考以下方法&#xff1a; 四个洞见 模型已经比人聪明&#xff1a;以ChatGPT o3为代表的AI非常强大&#xff0c;能运用高级理论解释道理、引用最新学术论文&#xff0c;生成对顶尖科学家都有用的…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)

在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

02.运算符

目录 什么是运算符 算术运算符 1.基本四则运算符 2.增量运算符 3.自增/自减运算符 关系运算符 逻辑运算符 &&&#xff1a;逻辑与 ||&#xff1a;逻辑或 &#xff01;&#xff1a;逻辑非 短路求值 位运算符 按位与&&#xff1a; 按位或 | 按位取反~ …...