本文主要记录 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>***.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
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 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
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
四、源码地址
点此查看
|