打包和部署Java应用程序:Maven和Shell脚本的实用方法

news/2024/11/18 2:23:47/

在软件开发领域,高效打包和分发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脚本提供的功能,可以更方便地监控应用程序的运行状态和查看日志,提高了部署后的维护性。


http://www.ppmy.cn/news/1236958.html

相关文章

自己动手打包构建编译cri-dockerd

1.背景 本机是 armv7l架构cpu&#xff0c;发现官方文档中竟然没有&#xff0c;因此需要自己编译下&#xff1b; [rootcontainer0 ~]# uname -a Linux container0 5.4.206-v7l.1.el7 #1 SMP Mon Jul 25 14:13:29 UTC 2022 armv7l armv7l armv7l GNU/Linux2.打包/构建/编译 gi…

springboot(ssm灾害应急救援平台 应急管理平台Java(codeLW)

springboot(ssm灾害应急救援平台 应急管理平台Java(code&LW) 开发语言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.7&#xff08;或8.0&#x…

「X」Embedding in NLP|一文读懂 2023 年最流行的 20 个 NLP 模型

在上一篇文章中&#xff0c;我们已经科普了什么是自然语言处理&#xff08;NLP&#xff09;、常见用例及其与向量数据库的结合。今天&#xff0c;依然是「X」Embedding in NLP 系列专题&#xff0c;本文为初阶第二篇&#xff0c;我们将深入介绍在 2023 年爆火的大语言模型 NLP …

大数据分析与应用实验任务九

大数据分析与应用实验任务九 实验目的 进一步熟悉pyspark程序运行方式&#xff1b; 熟练掌握pysaprkRDD基本操作相关的方法、函数&#xff0c;解决基本问题。 实验任务 进入pyspark实验环境&#xff0c;打开命令行窗口&#xff0c;输入pyspark&#xff0c;完成下列任务&am…

通过这个简单的技巧让我们的 JavaScript 代码变得异常快

通过这个简单的技巧让我们的 JavaScript 代码变得异常快 秘诀&#xff1a;了解JavaScript 虚拟机(VM)的内部工作原理。 首先&#xff0c;我们来谈谈像 V8 这样的JavaScript 虚拟机(VM)。可以把它想象成我们的操作的大脑 —— 它将我们简洁的代码变成计算机可以理解和执行的东…

QT 中的元对象系统

作为一名十几年的 C 程序员&#xff0c;最近一段时间使用 QT 开发程序&#xff0c;发现 QT 中还是有许多值得深入理解的技术。QT 不仅仅是一个应用程序开发框架&#xff0c;还有一些对标准 C 的扩充。本文和大家一起探讨 QT 中的元对象系统。 在分析 QT 中的元对象系统之前&…

百战python02-语言元素

文章目录 指令与程序变量与类型变量命名变量的使用运算符赋值运算符比较运算符和逻辑运算符练习1:华氏温度转换为摄氏温度练习2:输入圆的半径计算计算周长和面积练习3:输入年份判断是不是闰年字符串常用操作注:需要对python有基本了解,可查看本作者python基础专栏,有任何问…

洛谷 P1883 函数

P1883 函数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) Error Curves - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 这两题是一模一样的&#xff0c;过一题水两题。 分析 主要难点在于证明F(x)是一个单峰函数可以被三分&#xff0c;但是我随便画了几个f(x)之后发现好像…