本文主要记录 SpringBoot + Maven 打包时,如何进行分离,分离相关引用依赖、配置文件、启停脚本等。

打包分离的原因背景

在日常开发过程中,如果通过手动打包部署时,我们会发现打包出来的 jar 文件一般都会特别大,每次我们只修改了其中部分内容,可能就是修改了其中的某一个类的内容或者几个类的内容,最后都要将整个 jar 包上传到部署服务器,传输过程中就会特别慢,所以这次就来提高我们部署的效率,如果没必要做全量替换,我们就只进行增量或者少量替换。

一、工程准备

首先创建一个 demo
在这里插入图片描述

其中主要的几个文件:pom.xml、assembly.xml、以及配套的启停脚本

1、pom 文件的相关 maven 打包插件

这里主要是三个 maven 插件,我们在 pom 文件中引入即可

maven-jar-plugin:主要用来打包我们的代码 jar,指定其中需要包含和去除的文件
maven-assembly-plugin:主要用来打压缩包,配置我们打包后的整体文件结构
maven-antrun-plugin:主要用来解压 maven-assembly-plugin 插件打好的压缩包,偷个小懒,去掉打包完成后自己去手动解压的步骤

maven-jar-plugin
<!--maven-jar-plugin 负责将应用程序打包成可执行的jar文件-->
            <!-- 打包成jar文件,并指定lib文件夹以及resources资源文件夹 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <!--运行jar包时运行的主类,要求类全名-->
                            <mainClass>com.wxw.notes.builddemo.BuildDemoApplication</mainClass>
                            <!-- 指定依赖的时候声明前缀 -->
                            <classpathPrefix>lib/</classpathPrefix>
                            <!-- 是否指定项目classpath下的依赖 -->
                            <addClasspath>true</addClasspath>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <excludes>
                        <!-- 去掉不需要打进 jar 的配置文件 -->
                        <exclude>**/*.yml</exclude>
                        <exclude>**/*.sh</exclude>
                        <exclude>**/bin</exclude>
                        <exclude>**/config</exclude>
                    </excludes>
                </configuration>
            </plugin>
maven-assembly-plugin
<!--maven-assembly-plugin,负责将整个项目按照自定义的目录结构打成最终的压缩包,方便实际部署 -->
            <plugin>
                <!--使用插件-->
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <!--自定义的configuration配置后,将会生成一个demo-demo.jar 文件在目录 output 下,其中前一个demo
                    来自finalName,后一个demo来自assembly descriptor中的id,其中的内容和默认的打包出来的jar类似,
                    如果只想有finalName,则增加配置:<appendAssemblyId/>-->
                    <appendAssemblyId>false</appendAssemblyId>
                    <!--输出路径-->
                    <outputDirectory>${project.build.directory}/dist/</outputDirectory>
                    <!--描述文件位置-->
                    <descriptors>
                        <descriptor>src/main/resources/assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <!--配置执行器-->
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <!--绑定到package生命周期阶段上-->
                        <phase>package</phase>
                        <goals>
                            <!--只运行一次-->
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
maven-antrun-plugin
 <!-- 解压插件 -->
            <plugin>
                <artifactId>maven-antrun-plugin</artifactId>
                <executions>
                    <execution>
                        <!-- 绑定到package生命周期阶段上 -->
                        <phase>package</phase>
                        <configuration>
                            <tasks>
                                <echo message="unziping ${project.artifactId}.zip"/>
                                <!-- src:需要解压文件的路径,dest:文件解压之后的路径 -->
                                <unzip src="target/dist/${project.artifactId}.zip" dest="target/dist/${project.artifactId}"/>
                            </tasks>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

2、maven-assembly-plugin 插件对应的配置文件

主要是 assembly.xml 文件

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">

    <!--标识符,添加到生成文件名称的后缀符。如果指定 id 的话,目标文件则是 ${artifactId}-${id}.zip-->
    <id>build-demo</id>
    <formats>
        <!--指定打包类型: zip、tar、tar.gz(or tgz)、tar.bz2 (or tbz2)、tar.snappy 、tar.xz (or txz)、jar、dir、war-->
        <format>zip</format>
    </formats>

    <!--是否包含根目录-->
    <!--指定是否包含打包层目录(比如finalName是build-demo,当值为true,所有文件被放在build-demo目录下,否则直接放在包的根目录下)-->
    <includeBaseDirectory>true</includeBaseDirectory>


    <fileSets><!--指定要包含的文件集,可以定义多个fileSet;-->
        <fileSet>
            <!--指定要包含的目录-->
            <directory>src/main/resources/</directory>
            <!--指定当前要包含的目录的目的地-->
            <outputDirectory>/</outputDirectory>
            <!-- 指定排除的文件 -->
            <excludes>
                <exclude>assembly.xml</exclude>
            </excludes>
        </fileSet>
    </fileSets>

    <!--用来定制工程依赖 jar 包的打包方式-->
    <dependencySets>

        <dependencySet>
            <!--  当前工程的依赖和工程本身生成的jar都会被打包进来。如果要排除工程自身生成的jar,useProjectArtifact 设定为 false-->
            <useProjectArtifact>false</useProjectArtifact>
            <!--设置相对于程序集根目录根目录的输出目录-->
            <outputDirectory>/lib</outputDirectory>
            <!--默认级别-->
            <!--将scope为runtime的依赖包打包-->
            <scope>runtime</scope>
            <excludes>
                <exclude>${project.groupId}:${project.artifactId}</exclude>
            </excludes>
        </dependencySet>
        <!--        自己代码对应的 jar 包-->
        <dependencySet>
            <!--输出路径-->
            <outputDirectory>/</outputDirectory>
            <includes>
                <include>${project.groupId}:${project.artifactId}</include>
            </includes>
        </dependencySet>
    </dependencySets>
</assembly>

二、开始打包

1、开始打包

主要就是执行两个 maven 命令
一个 clean
一个 package
依次执行
在这里插入图片描述

2、打包后的目录

打包之后的目录如下
一个未解压的压缩包,一个解压好的文件
在这里插入图片描述
这样我们的配置文件 config 、 jar 包依赖 lib 和启停脚本 bin 就被分离出来了,这样我们在系统变更部署时,就可以挑选我们需要变更的内容进行传输即可

三、配套启停脚本

最后贴上启停脚本

1、start.sh

#!/bin/sh

# 以下路径根据实际情况修改,可使用相对路径(使用相对路径则注意运行脚本时必须在bin目录下运行,否则会找不到对应的路径),最好使用绝对路径
# jar 包所在路径
server_name="../build-demo-1.0.jar"
# 配置文件路径
server_config_location="../config/"
# 日志目录路径
server_log_location="../logs/"
# 日志所在路径
server_log_name="../logs/logs.log"

# 如果日志目录不存在先创建
if [ ! -d ${server_log_location} ];then
mkdir ${server_log_location}
else
echo ""
fi

# nohup:在后台运行jar包
# -jar ${server_name}:指定启动的jar包
# --spring.config.location:指定配置文件目录或者文件名称,如果是目录,以/结束
# > ${server_log_name}:指定日志输出路径
# 2>&1 :将正常的运行日志和错误日志合并输入到指定日志
# & 在后台运行
nohup java -jar ${server_name}  --spring.config.location=${server_config_location} > ${server_log_name}  2>&1 &

echo ${server_name} is starting ......

tail -f ${server_log_name}

2、stop.sh

#!/bin/bash
#变量设置,如果以下变量名不能满足需求,则自行新增一个变量名,在启动脚本中引用,整个脚本格式不变

#service_name以进程中的唯一关键字命名,或者以jar包名命名
server_name="../build-demo-1.0.jar"

#得到进程号
PID_NUM=$(ps -ef |grep $server_name|grep -v grep|awk '{print $2}' |sed ':label;N;s/\n/ /;b label')

#某些服务会启动多个进程,则一次全部停止,同样作用于一个进程的服务
for i in $PID_NUM
do
  kill -9 $PID_NUM
  echo -e "$server_name is\033[1;31m STOP \033[0m"
done

四、源码地址

点此查看

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐