在没写这篇文章之前从来没想过springboot的项目要增量部署。直到在一次面试中被问到,现记录分享给小伙伴。
- 全量部署
使用spring-boot-maven-plugin插件,每次项目修改完后直接打包,替换掉生产的包即可,这个没什么好说的。
依赖的包位于BOOT-INF下的lib目录中。
- 增量部署
先想下为什么要增量部署呢?如果升级你都要传一个很大的包到生产服务器,很慢。。。
那我们为什么不采用分来打包的方式呢,就跟没用springboot之前一样,分项目包和lib目下的包。
怎么实现?
1、注释掉spring-boot-maven-plugin打包插件。
2、添加maven-jar-plugin,maven-dependency-plugin,maven-assembly-plugin插件。(感觉跟没用springboot和maven之前ant打包差不多,也是xml的方式配置打包)。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
//启动类名称包含包路径
<mainClass>com.*.Application</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-lib</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
<includeScope>compile</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
assembly.xml的配置:
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>true</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
</includes>
<filtered>true</filtered>
<outputDirectory>${file.separator}config</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/resources/runScript</directory>
<outputDirectory>${file.separator}bin</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.build.directory}/lib</directory>
<outputDirectory>${file.separator}lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>${file.separator}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
在xml中可以配置打包内容,比如第一次上线要config,lib,项目jar,后面增量更新时只需要打包项目jar即可。打包后会是一个zip文件,上传到生产环境,unzip后即可使用。
tips:项目jar中可以不打配置文件。
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*.yml</exclude>
</excludes>
</resource>
</resources>
如果配置文件是yml格式,需要引入snakeyaml依赖。
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>1.25</version>
</dependency>
3、如果依赖无变化,以后每次升级时只需传项目的jar包就可以。(但是如果依赖包有变化(新增或者版本升级需要把变动的依赖也更新到生产服务器))。
生产环境目录结构会是:
其中config文件夹中是你的配置文件。
lib包中是项目的的依赖jar包。
红线抹住的部署是项目的jar包。
- 总结
写到最后还在想,springboot直接打包不香吗?也没感觉有多慢。也可能是眼界问题吧。
本文完。