Spring Boot项目和依赖分离打包

用Spring Boot开发单体应用,一般也就是编译打包为一个jar包,然后java -jar **”优雅”**启动,方便快捷,平时工作中也完全是整个jar再构建成Docker镜像,部署到K8S上。所以,并不是很关心jar的大小。直到前几天,一个朋友说要做个小应用。我就用RuoYi Plus 帮他快速干了一个项目。最终打包下来169M,就目前千兆宽带来说,这个大小,小意思啦。问题是在于,他还要通过VPN传到内网上去,大概就200KB每秒,这样一来,重新部署一次,就这个传输时间就比较耗时了。这就得把依赖包独立出来,不统一打包进项目的jar,让项目包瘦下来。

这里我们需要用到两个maven插件,maven-jar-pluginmaven-dependency-plugin,具体配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
<build>  
<!-- 设置构建输出的最终文件名(不包含后缀),这里直接使用项目的artifactId -->
<finalName>${project.artifactId}</finalName>
<!-- 定义构建过程中使用的插件 -->
<plugins>
<!-- 配置maven-jar-plugin插件以自定义JAR包的构建 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version> <!-- 使用maven-jar-plugin的指定版本,这里需要替换为实际的版本号 -->
<configuration>
<!-- 配置JAR包的归档选项 -->
<archive>
<!-- 配置MANIFEST.MF文件 -->
<manifest>
<!-- 添加Class-Path到MANIFEST.MF中,以便运行时能够找到依赖的JAR -->
<addClasspath>true</addClasspath>
<!-- 指定Class-Path的前缀,这里假设所有依赖都被复制到了lib目录下 -->
<classpathPrefix>lib/</classpathPrefix>
<!-- 是否在Class-Path中使用依赖的唯一版本 -->
<useUniqueVersions>false</useUniqueVersions>
<!-- 指定包含main方法的类,即程序入口 -->
<mainClass>org.dromara.DromaraApplication</mainClass> <!-- 替换为你的主类全路径 -->
</manifest>
</archive>
<!-- 指定JAR包输出的目录,这里设置为Maven的构建输出目录 -->
<outputDirectory>${project.build.directory}</outputDirectory>
</configuration>
</plugin>

<!-- 配置maven-dependency-plugin插件以复制项目的依赖 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>${maven-dependency-plugin.version}</version> <!-- 使用maven-dependency-plugin的指定版本,这里需要替换为实际的版本号 -->
<executions>
<!-- 定义一个执行目标,该目标会在package阶段执行 -->
<execution>
<id>copy-dependencies</id>
<!-- 绑定到package生命周期阶段 -->
<phase>package</phase>
<!-- 指定要执行的目标 -->
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!-- 指定依赖复制到的目标目录 -->
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<!-- 只复制运行时作用域的依赖 -->
<includeScope>runtime</includeScope>
<!-- 如果存在,覆盖已发布的版本 -->
<overWriteReleases>true</overWriteReleases>
<!-- 如果存在,覆盖快照版本 -->
<overWriteSnapshots>true</overWriteSnapshots>
<!-- 如果依赖较新,则覆盖 -->
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>

这里,我也是把配置文件分离出来,单独放在一个文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<resources>
<resource>
<directory>src/main/resources</directory>
<!-- 关闭过滤 -->
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<targetPath>${project.build.directory}/config</targetPath>
<!-- 引入所有 匹配文件进行过滤 -->
<includes>
<include>application*</include>
<include>bootstrap*</include>
<include>banner*</include>
</includes>
<!-- 启用过滤 即该资源中的变量将会被过滤器中的值替换 -->
<filtering>true</filtering>
</resource>
</resources>

接下来,再写个启动脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@echo off  
setlocal enabledelayedexpansion

:: 设置Java可执行文件路径,这里假设已经配置了JAVA_HOME环境变量
set JAVA_CMD=D:\tools\dev\openjdk-17.0.2_windows-x64_bin\jdk-17.0.2\bin\java

:: 设置主类全路径
set MAIN_CLASS=org.dromara.DromaraApplication

:: 设置classpath,包括lib目录下的所有jar和你的应用jar
set CLASSPATH=.;lib/*;xxx-admin.jar

:: 使用java命令启动应用
%JAVA_CMD% -cp "%CLASSPATH%" %MAIN_CLASS% --spring.config.location=file:config/ --spring.profiles.active=prod

:end
endlocal

--spring.config.location指定配置文件目录,--spring.profiles.active指定启动环境

这样一来,以后就只需要传我们有改动的jar包即可。

Spring Boot项目和依赖分离打包

https://blogs.52fx.biz/posts/3723104535.html

作者

eyiadmin

发布于

2024-09-11

更新于

2024-09-13

许可协议

评论