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