springboot如何将lib和jar分离

遇到一个问题,就是每次maven package或者maven install后target中的jar很大,少的50几MB,大的100多兆

优化前:

优化后:

|--------|--------|-----|
| 优化前 | 优化后 | 压缩率 |
| 77.2MB | 4.65MB | 93% |

具体方案:

pom.xml中

XML 复制代码
  <build>
    <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.5.15</version>
                <configuration>
                    <!-- 指定该jar包启动时的主类[建议] -->
                    <mainClass>com.ruoyi.RuoYiApplication</mainClass>
                    <!--使用-Dloader.path需要在打包的时候增加<layout>ZIP</layout>,不指定的话-Dloader.path不生效-->
                    <layout>ZIP</layout>
                    <!--这里是填写需要包含进去的jar,必须项目中的某些模块,会经常变动,那么就应该将其坐标写进来,如果没有则nothing ,表示不打包依赖 -->
                    <includes>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-framework</artifactId>
                        </include>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-quartz</artifactId>
                        </include>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-quartz</artifactId>
                        </include>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-slw</artifactId>
                        </include>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-system</artifactId>
                        </include>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-common</artifactId>
                        </include>
                        <include>
                            <groupId>com.ruoyi</groupId>
                            <artifactId>ruoyi-generator</artifactId>
                        </include>
                    </includes>
                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <failOnMissingWebXml>false</failOnMissingWebXml>
                    <warName>${project.artifactId}</warName>
                </configuration>
            </plugin>
  
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <id>copy</id>
                        <phase>package</phase>
                        <goals>
                            <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>${project.build.directory}/lib</outputDirectory>
                            <!-- 打包的时候将项目中的模块不能打包进去 -->
                            <!--<excludeArtifactIds>ruoyi-common,ruoyi-framework,ruoyi-quartz,ruoyi-generator,ruoyi-slw,ruoyi-system</excludeArtifactIds>-->
                            <!-- 所有com.ruoyi开头的项目,都不需要打包进去 -->
                            <excludeGroupIds>com.ruoyi</excludeGroupIds>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

说明:

1、spring-boot-maven-plugin 主要是将项目的依赖lib打包到项目jar中,这样就会导致打包后的jar特别大

2、maven-dependency-plugin 该插件主要是将pom.xml中的jar复制到lib文件夹中,同时需要将项目中的模块排除(<excludeGroupIds>com.ruoyi</excludeGroupIds>,如果项目有多个模块的话,这个请务必加上,否则lib和jar里面都包含相同的lib的话会导致jar冲突报错,如下图)

优化前的执行命令

java -jar ruoyi-admin.jar

优化后的执行命令 需要指定外部lib的路径,.\lib是指jar当前路径下的lib文件夹中查找依赖

java -Dloader.path=.\lib -jar ruoyi-admin.jar

由于windows服务器上面使用的 是winSW工具,需要在arguments中加上指定依赖路径的命令

XML 复制代码
<service>
    <id>slwDataService</id>
    <!-- Display name of the service -->
    <name>slwService</name>
    <!-- Service description -->
    <description>数据报表</description>
    <executable>java</executable>
    <arguments>-Dloader.path=.\lib -jar D:\system_slw\ruoyi-admin.jar</arguments>
    <!-- 开机启动 -->
    <startmode>Automatic</startmode>
    <!-- 日志配置 -->
    <logpath>D:/system_slw/logs</logpath>
    <logmode>none</logmode>
</service>
相关推荐
我不是混子几秒前
什么是Java 的 Lambda 表达式?
java·后端
武子康4 分钟前
大数据-110 Flink 安装与部署指南 支持 Local/Standalone/YARN 的多种模式
大数据·后端·flink
qinyuan1515 分钟前
生产环境go-redsync使用示例
后端·go
专家大圣26 分钟前
Bililive-go+cpolar:跨平台直播录制的远程管理方案
开发语言·网络·后端·golang·内网穿透·设计工具
Cache技术分享43 分钟前
202. Java 异常 - throw 语句的使用
前端·后端
程序员小假1 小时前
我们来说一说 ThreadLocal 内存泄漏
java·后端
moisture1 小时前
SGLang 混合并行
后端·llm
我不是混子1 小时前
聊聊Spring事件机制
java·后端
Mintopia1 小时前
🚪 当 Next.js 中间件穿上保安制服:请求拦截与权限控制的底层奇幻之旅
前端·后端·next.js
yunxi_051 小时前
让大模型会“说话”:基于 Spring WebSocket 的毫秒级流式 RAG 对话
java·后端