生产上发布 Spring Boot 项目时,流程颇为繁琐且低效。但凡代码有一丁点改动,就得把整个项目重新打包部署,耗时费力不说,生成的 JAR 包还特别臃肿,体积庞大。每次更新项目,光是上传这大文件就得花费不少时间,严重影响工作节奏。
为解决这一痛点,我打算把依赖库以及配置文件(lib 文件夹下的那些 jar 包,还有config下的applacation.yml等文件)从项目主体里剥离出来,后续部署时,只需发布核心代码就行,这样既能加快部署速度,又能减轻文件传输负担,让项目更新变得轻松便捷
利用springboot中resource插件来排除配置,并统一打包到config目录下
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<targetPath>${project.build.directory}/configtargetPath>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.ymlinclude>
<include>**/*.xmlinclude>
<include>mapper/*.xmlinclude>
includes>
resource>
resources>
org.springframework.boot
spring-boot-maven-plugin
-Dfile.encoding=UTF-8
ZIP
no-exists-jar
non-exists-jar
repackage
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>${project.build.directory}/liboutputDirectory>
<excludeTransitive>falseexcludeTransitive>
<stripVersion>falsestripVersion>
<includeScope>runtimeincludeScope>
configuration>
execution>
executions>
plugin>
打包后目录结构,如下图所示
执行命令 java -jar -Dloader.path=./lib -jar xxx.jar
注意 springboot启动时候会优先读取config目录下配置文件 所以这里不用指定-Dspring.config.location=XX.yml
文件
注意 例如日志文件配置以及mybits等配置文件 可以配成绝对路径 如下所示:
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
- 视频教程:https://doc.iocoder.cn/video/
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<configuration>
<encoding>UTF-8encoding>
configuration>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-resourcesgoal>
goals>
<configuration>
<outputDirectory>${project.build.directory}/twin-web/configoutputDirectory>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
resource>
resources>
configuration>
execution>
executions>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-jar-pluginartifactId>
<configuration>
<outputDirectory>
${project.build.directory}/twin-web/
outputDirectory>
<archive>
<addMavenDescriptor>falseaddMavenDescriptor>
<manifest>
<addClasspath>trueaddClasspath>
<classpathPrefix>./libs/classpathPrefix>
<mainClass>com.keqing.twinweb.TwinWebApplicationmainClass>
manifest>
<manifestEntries>
<Class-Path>./config/Class-Path>
manifestEntries>
archive>
<excludes>
<exclude>*.ymlexclude>
<exclude>mapper/**exclude>
<exclude>*.xmlexclude>
excludes>
configuration>
plugin>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-dependency-pluginartifactId>
<executions>
<execution>
<id>copy-dependenciesid>
<phase>packagephase>
<goals>
<goal>copy-dependenciesgoal>
goals>
<configuration>
<outputDirectory>${project.build.directory}/twin-web/libsoutputDirectory>
<excludeTransitive>falseexcludeTransitive>
<stripVersion>falsestripVersion>
<includeScope>runtimeincludeScope>
configuration>
execution>
executions>
plugin>
使用package打包后的目录
查看自己打包后jar目录,注意这种打包方式弊端,按照一定约定格式规范固定了,一旦依赖jar包(包括配置文件目录等)发生变化就必须重新打包
启动程序java -jar xxx.jar
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
- 项目地址:https://github.com/YunaiV/yudao-cloud
- 视频教程:https://doc.iocoder.cn/video/
maven-assembly-plugin
是 Maven 中的一个插件,它允许用户将项目的输出以及依赖、模块、站点文档和其他文件打包成一个可发布的格式,例如 zip、tar.gz、jar 等。以下是使用 maven-assembly-plugin
的一些优势:
- 自定义打包格式: maven-assembly-plugin 允许你通过定义描述符文件(descriptor)来完全自定义打包的内容和格式。你可以选择包含或排除特定的文件和目录。
- 一键打包: 通过一个简单的 Maven 命令,你可以创建一个包含所有必需依赖的单一归档文件,这使得分发和部署变得非常简单。
- 多环境支持: 可以为不同的环境(开发、测试、生产)创建不同的打包配置,使得环境迁移更加容易。
- 依赖管理: 插件会自动处理项目依赖,将它们打包到最终的归档文件中,无需手动管理。
- 模块化项目支持: 对于多模块项目,maven-assembly-plugin 可以将所有模块的输出合并到一个归档文件中。
- 预配置的描述符: 插件提供了一些预定义的描述符,如 bin、jar-with-dependencies 等,可以直接使用,无需自定义。
- 灵活性: 你可以通过修改描述符文件来调整打包行为,以适应不同的需求。
- 集成性: maven-assembly-plugin 与 Maven 生态系统紧密集成,可以与其他 Maven 插件协同工作。
- 文档和社区支持: 由于 maven-assembly-plugin 是 Maven 的一部分,因此有广泛的文档和社区支持。
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.ymlinclude>
<include>**/*.xmlinclude>
<include>mapper/*.xmlinclude>
includes>
resource>
resources>
<plugin>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-maven-pluginartifactId>
<configuration>
<jvmArguments>-Dfile.encoding=UTF-8jvmArguments>
<layout>ZIPlayout>
<includes>
<include>
<groupId>no-exists-jargroupId>
<artifactId>non-exists-jarartifactId>
include>
includes>
configuration>
<executions>
<execution>
<goals>
<goal>repackagegoal>
goals>
execution>
executions>
plugin>
<plugin>
<artifactId>maven-assembly-pluginartifactId>
<configuration>
<appendAssemblyId>falseappendAssemblyId>
<descriptors>
<descriptor>assembly.xmldescriptor>
descriptors>
configuration>
<executions>
<execution>
<id>make-assemblyid>
<phase>packagephase>
<goals>
<goal>singlegoal>
goals>
execution>
executions>
plugin>
配置assembly.xml文件
<assembly>
<id>make-assemblyid>
<formats>
<format>tar.gzformat>
<format>zipformat>
formats>
<includeBaseDirectory>trueincludeBaseDirectory>
<fileSets>
<fileSet>
<lineEnding>unixlineEnding>
<directory>${basedir}/bindirectory>
<outputDirectory>${file.separator}outputDirectory>
<fileMode>0755fileMode>
<includes>
<include>**.shinclude>
<include>**.batinclude>
includes>
fileSet>
<fileSet>
<directory>${basedir}/src/main/resourcesdirectory>
<outputDirectory>configoutputDirectory>
<fileMode>0644fileMode>
<includes>
<include>*.propertiesinclude>
<include>*.ymlinclude>
<include>*.xmlinclude>
<include>mapper/*.xmlinclude>
includes>
fileSet>
<fileSet>
<directory>${project.build.directory}directory>
<outputDirectory>${file.separator}outputDirectory>
<includes>
<include>*.jarinclude>
includes>
fileSet>
fileSets>
<dependencySets>
<dependencySet>
<unpack>falseunpack>
<useProjectArtifact>trueuseProjectArtifact>
<outputDirectory>liboutputDirectory>
<scope>providedscope>
dependencySet>
<dependencySet>
<unpack>falseunpack>
<useProjectArtifact>trueuseProjectArtifact>
<outputDirectory>liboutputDirectory>
<scope>systemscope>
dependencySet>
<dependencySet>
<unpack>falseunpack>
<useProjectArtifact>trueuseProjectArtifact>
<outputDirectory>liboutputDirectory>
<scope>runtimescope>
dependencySet>
dependencySets>
assembly>
打包后目录
解压zip目录查看
使用命令启动项目java -jar -Dloader.path=./lib -jar xxx.jar