在实际的软件开发和部署过程中,项目的构建、打包和部署是关键的环节。然而,在大型的Spring Boot项目中,每次修改一小部分代码或仅仅更新某个依赖jar包时,都需要重新进行整个项目的构建、打包、上传和部署,导致部署时间变得相对较长。加大网络传输和部署的时间成本。
为了应对这个问题,许多企业开始采用一种将项目代码与依赖库分离的部署策略。这种策略的核心思想是将项目的依赖库(lib 目录)与实际代码分开,从而在部署时只需要发布代码而不包含依赖库。这样的做法有助于降低部署时间,特别是在仅有小部分代码变动或者仅有依赖库更新的情况下,可以实现更为高效的部署流程。
为了进一步提高部署的效率,一些企业还希望实现对依赖 jar 包的增量发布,即只有依赖库发生变化时才进行发布,避免不必要的重复操作。
为了满足这些需求,上述示例通过 Maven 插件的配置,将项目的依赖库与代码分离,同时实现了对依赖 jar 包的增量发布。这种部署策略有助于提高部署的效率,减少因为代码变动较小而重新打包整个项目所带来的时间和网络传输成本。
MAVEN pom.xml 添加如下内容:
<build>
<plugins>
<!-- 分离lib -->
<plugin>
<!--这个插件就是把依赖的jar包复制出来放到编译后的target/lib目录,并且在打包时候排除内部依赖-->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</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>
</configuration>
</execution>
</executions>
</plugin>
<!-- 分离资源文件 -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<outputDirectory>${project.build.directory}/resources-application
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!--打包jar-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<!-- 指定资源文件目录,与打包的jar文件同级目录 -->
<manifestEntries>
<Class-Path>resources-application/</Class-Path>
</manifestEntries>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<!-- 制定启动项` -->
<mainClass>com.tech.Application</mainClass>
</manifest>
</archive>
<!-- 打包时忽略的文件(也就是不打进jar包里的文件),将resources下的所有文件全部排除 -->
<excludes>
<exclude>**/*.properties</exclude>
<exclude>**/*.xml</exclude>
<exclude>**/*.yml</exclude>
<exclude>static/**</exclude>
<exclude>templates/**</exclude>
</excludes>
</configuration>
</plugin>
<!-- spring boot repackage -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>com.tech</groupId>
<artifactId>application</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>