SpringBoot项目瘦身的实战指南

 更新时间:2025年09月15日 09:39:11   作者:嘵奇  
Spring Boot应用瘦身顾名思义就是:将Spring Boot应用打包后的jar包,利用合理的方式,方法减小体积,因此本文给大家介绍了SpringBoot项目瘦身的实战指南,需要的朋友可以参考下

一、问题背景

SpringBoot的"约定优于配置"特性极大提升了开发效率,但默认配置可能导致项目逐渐臃肿。典型的症状包括:

  • 打包后的JAR文件超过100MB
  • 启动时间超过10秒
  • 内存占用居高不下
  • 包含大量未使用的依赖

二、依赖优化

1. 依赖树分析

# Maven项目
mvn dependency:tree > dependencies.txt

# Gradle项目
gradle dependencies > dependencies.txt

通过分析依赖树,定位非必要依赖(如SpringBoot默认引入的嵌入式数据库驱动)

2. 精准依赖管理

<!-- 示例:排除Tomcat使用Jetty -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

3. 使用SpringBoot Thin Launcher

<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot.experimental</groupId>
            <artifactId>spring-boot-thin-layout</artifactId>
            <version>1.0.28.RELEASE</version>
        </dependency>
    </dependencies>
</plugin>

通过分离依赖和代码,构建产物可缩减至原始大小的10%

三、模块化拆分

  1. 按功能划分模块(核心业务/公共服务/数据访问)
  2. 使用@SpringBootApplication(scanBasePackages = "com.yourpackage")限制扫描范围
  3. 动态加载非核心功能(结合Spring Profiles)

四、资源配置优化

1. 资源过滤

<resources>
    <resource>
        <directory>src/main/resources</directory>
        <excludes>
            <exclude>**/*.ftl</exclude>
            <exclude>test-data/*</exclude>
        </excludes>
    </resource>
</resources>

2. 静态资源处理

  • 启用CDN托管静态资源
  • 使用WebJars管理前端依赖

五、构建配置调优

Maven配置示例

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <excludeDevtools>true</excludeDevtools>
                <excludeGroupIds>org.unnecessary</excludeGroupIds>
                <layers>
                    <enabled>true</enabled>
                </layers>
            </configuration>
        </plugin>
    </plugins>
</build>

Gradle配置技巧

bootJar {
    layered {
        enabled = true
    }
    exclude "**/development/*"
}

六、启动优化

  1. 延迟初始化
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class)
           .lazyInitialization(true)
           .run(args);
    }
}
  1. 关闭自动配置
@EnableAutoConfiguration(exclude = {
    DataSourceAutoConfiguration.class,
    CacheAutoConfiguration.class
})

七、代码级优化

  1. 使用@ConditionalOnProperty控制Bean加载
  2. 移除冗余DTO/VO转换
  3. 采用响应式编程减少线程消耗

八、高级技巧

  1. 使用GraalVM Native Image(缩减至50MB以下)
  2. 实施JLink定制化JRE
  3. 采用分层Docker镜像构建
FROM adoptopenjdk:11-jre-hotspot as builder
# 构建阶段...

FROM adoptopenjdk:11-jre-hotspot
COPY --from=builder /app/dependencies/ ./
COPY --from=builder /app/snapshot-dependencies/ ./
COPY --from=builder /app/application/ ./

九、验证与监控

  1. 使用SpringBoot Actuator的/metrics端点
  2. 集成JProfiler进行内存分析
  3. 持续集成时添加大小检查:
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-enforcer-plugin</artifactId>
    <executions>
        <execution>
            <id>enforce-size</id>
            <goals><goal>enforce</goal></goals>
            <configuration>
                <rules>
                    <requireFilesSize>
                        <maxSize>100000000</maxSize> <!-- 100MB -->
                        <files>
                            <file>target/*.jar</file>
                        </files>
                    </requireFilesSize>
                </rules>
            </configuration>
        </execution>
    </executions>
</plugin>

十、总结建议

  • 定期执行依赖审计(建议季度执行)
  • 建立模块化开发规范
  • 平衡优化与可维护性
  • 结合CI/CD实施自动化瘦身检查

通过上述系统性优化,典型SpringBoot项目可达到:

  • JAR包体积减少60%-80%
  • 启动时间缩短40%-60%
  • 内存消耗降低30%-50%
  • 构建速度提升2-3倍

注意事项:生产环境优化前务必进行全面测试,避免过度优化导致功能异常。

以上就是SpringBoot项目瘦身的实战指南的详细内容,更多关于SpringBoot项目瘦身的资料请关注脚本之家其它相关文章!

相关文章

  • SpringMVC JSON数据交互及RESTful支持实现方法

    SpringMVC JSON数据交互及RESTful支持实现方法

    这篇文章主要介绍了SpringMVC JSON数据交互及RESTful支持实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • SpringBoot Cache 二级缓存的使用

    SpringBoot Cache 二级缓存的使用

    本文主要介绍了SpringBoot Cache 二级缓存的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • java自动生成ID号的方法

    java自动生成ID号的方法

    这篇文章主要介绍了java自动生成ID号的方法,涉及java生成ID号的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 使用eclipse + maven一步步搭建SSM框架教程详解

    使用eclipse + maven一步步搭建SSM框架教程详解

    SSM(Spring+SpringMVC+MyBatis)框架集由Spring、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架.这篇文章主要介绍了eclipse + maven搭建SSM框架 ,需要的朋友可以参考下
    2017-11-11
  • Java应用打包成Docker镜像

    Java应用打包成Docker镜像

    这篇文章主要为大家介绍了Java应用打包成Docker镜像的过程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Spring 项目常用pom文件的依赖

    Spring 项目常用pom文件的依赖

    这篇文章主要介绍了Spring 项目常用pom文件的依赖,文中给大家提到了Spring boot starter pom的依赖关系说明,需要的朋友参考下吧
    2018-03-03
  • 简单讲解奇偶排序算法及在Java数组中的实现

    简单讲解奇偶排序算法及在Java数组中的实现

    这篇文章主要介绍了奇偶排序算法及Java数组的实现,奇偶排序的时间复杂度为O(N^2),需要的朋友可以参考下
    2016-04-04
  • 排查Java应用内存泄漏问题的步骤

    排查Java应用内存泄漏问题的步骤

    这篇文章主要介绍了排查Java应用内存泄漏问题的步骤,帮助大家更好的理解和学习Java,感兴趣的朋友可以了解下
    2020-11-11
  • 详解如何用Java实现对m3u8直播流抽帧

    详解如何用Java实现对m3u8直播流抽帧

    抽帧(frame extraction)是指从视频流中提取一些特定的帧,通常是关键帧或者随机帧,以供后续处理。这篇文章主要为大家介绍了如何用Java实现对m3u8直播流抽帧,需要的可以参考一下
    2023-03-03
  • Java Stream API 使代码更出色的操作完全攻略

    Java Stream API 使代码更出色的操作完全攻略

    这篇文章主要介绍了Java Stream API 使代码更出色的操作完全攻略,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04

最新评论