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

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

步骤1:Maven插件配置

旅程从Maven开始,这是Java生态系统中广泛使用的强大构建工具。我们利用maven-assembly-plugin配置我们项目的打包。以下是pom.xml文件中的相关配置:

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.yuanian.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文件中应包含的组件:

xml 复制代码
<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)来管理应用程序。让我们分解关键功能:

bash 复制代码
#!/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 ]; then
        echo "应用程序已在运行。"
    else
        nohup java -jar $APP_NAME $JAVA_OPTS > $LOG_FILE 2>&1 &
        echo "应用程序已启动。"
    fi
}

# stop():如果应用程序正在运行,则停止它。
# 首先尝试使用 'SIGTERM' 优雅地停止应用程序,如果失败,则使用 'kill -9' 强制停止。
stop() {
    PID=$(get_pid)
    if [ -z "$PID" ]; then
        echo "应用程序已停止。"
    else
        echo "正在停止应用程序..."
        kill -SIGTERM $PID
        sleep 5
        if [ $(is_running) -eq 1 ]; then
            echo "正在强制停止应用程序..."
            kill -9 $PID
        fi
        echo "应用程序已停止。"
    fi
}

# log():实时显示日志文件的内容。
log() {
    tail -f $LOG_FILE
}

# status():检查应用程序当前是否在运行。
status() {
    if [ $(is_running) -eq 1 ]; then
        echo "应用程序正在运行。"
    else
        echo "应用程序已停止。"
    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)" ]; then
        echo 0
    else
        echo 1
    fi
}

# 主执行逻辑
# 处理命令行参数以执行相应的函数。
# 支持的命令:start, stop, log, status。
# 对于无效命令显示使用信息。
case $1 in
    start)
        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脚本提供的功能,可以更方便地监控应用程序的运行状态和查看日志,提高了部署后的维护性。

相关推荐
骆晨学长8 分钟前
基于springboot的智慧社区微信小程序
java·数据库·spring boot·后端·微信小程序·小程序
AskHarries13 分钟前
利用反射实现动态代理
java·后端·reflect
@月落14 分钟前
alibaba获得店铺的所有商品 API接口
java·大数据·数据库·人工智能·学习
liuyang-neu20 分钟前
力扣 42.接雨水
java·算法·leetcode
z千鑫23 分钟前
【人工智能】如何利用AI轻松将java,c++等代码转换为Python语言?程序员必读
java·c++·人工智能·gpt·agent·ai编程·ai工具
Flying_Fish_roe37 分钟前
Spring Boot-Session管理问题
java·spring boot·后端
赚钱给孩子买茅台喝39 分钟前
智能BI项目第四期
java·spring boot·spring cloud·aigc
农民小飞侠1 小时前
python AutoGen接入开源模型xLAM-7b-fc-r,测试function calling的功能
开发语言·python
战神刘玉栋1 小时前
《程序猿之设计模式实战 · 观察者模式》
python·观察者模式·设计模式
敲代码不忘补水1 小时前
Python 项目实践:简单的计算器
开发语言·python·json·项目实践