SpringBoot应用瘦身记,兼从maven迁移到gradle手记
admin
2024-04-24 04:38:57
0

目录

    • 前言
    • 步骤
      • 选择合适的JDK版本
      • 从maven切换到gradle
      • 运行thinjar
      • 问题
      • 参考

前言

线上的SpringBoot应用已经达到350M,每次更新都花费半小时,虽然每天只更新一次。于是决定来一次瘦身。但是为了更方便的打包,例如既能打出fatjar,也能打出thinjar,同时也能根据需要打出war包,决定将构建脚本迁移到gradle。
2003年,我完成了手工构建(JBuilder2005)到ant自动构建的转变,2012年,完成了ant到maven的转变,后来,除了android应用外,Spring应用我都是才有maven构建,一直也很平稳,没给我惹过乱子。记得2012年采用maven构建时,IBM团队的一个老外坚决反对,他选用公司内部的一套ant框架。为何?人总是习惯使用用熟了的东西。

步骤

选择合适的JDK版本

目前JDK8, JDK11, JDK17是三个重要的版本。经过折腾,我选用了JDK11这个版本。不同版本的热部署方案有差异。

从maven切换到gradle

先执行

gradle init

即可生成build.gradle文件,里面包含了依赖,它将pom.xml的依赖转换成了gradle依赖。这个很不错。否则手工去写依赖就比较痛苦。

// 将依赖包复制到lib目录
task copyJar(type: Copy) {// 清除现有的lib目录delete "$buildDir/libs/lib"
//    //需要复制的文件from configurations.compileClasspathinto "$buildDir/libs/lib"
}// 拷贝配置文件
task copyConfigFile(type: Copy) {// 清除现有的配置目录
//    delete "$buildDir\\libs\\config"
//    from('src/main/resources')
//    into 'build/libs/config'
}bootJar {launchScript()// 例外所有的jarexcludes = ["*.jar", "fonts/*"]// lib目录的清除和复制任务dependsOn copyJardependsOn copyConfigFile// 指定依赖包的路径manifest {attributes 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher'attributes 'Start-Class': 'com.icool.CmsApplication'
//        attributes "Manifest-Version": 1.0,
//                'Class-Path': project.configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')}
}

这里两个注意点:

  • excludes把fatjar下的BOOT/lib的文件都排除掉,放到外面去,这是瘦身最主要的步骤
  • 采用PropertiesLauncher启动应用,不能采用缺省的JarLauncher。PropertiesLauncher支持-Dloader.path选项,这样就可以加载外部的jar了。

PropertiesLauncher允许通过配置loader.path使得jar包可以去加载外部的jar。而JarLauncher只能处理jar-in-jar这种模式。通常来说使用JarLauncher作为Main-Class被称为fat-jar,而PropertiesLauncher则可以将fat-jar变成thin-jar,之所以可以这样做,正是应为PropertiesLauncher使得jar包可以去加载外部的jar。

运行thinjar

瘦身后的jar运行方式:

java -Dloader.path=path/to/lib -Dspring.profiles.active=prod -jar cms-0.0.1-SNAPSHOT.jar

也可以:

java -cp bootApp.jar -Dloader.main=com.xxx.DemoApplication org.springframework.boot.loader.PropertiesLauncher

问题

迁移后,发现热部署不起作用了,一堆的Spring Bean创建问题,后来发现是自己安装了HotSwapAgent这个插件导致的。

参考

  • github.com/spring-projects-experimental/spring-boot-thin-launcher

相关内容

热门资讯

《荣耀战魂》战斗人物技能及游戏... 第1页:展开《荣耀战魂》好玩吗?相信很多玩家没机会上手,对其各方面体验如何并不了解,今天小编带来“q...
《NBA2K17》过人操作视频... 第1页:展开《NBA2K17》相对前作来说更加真实,而过人方面以往的方法明显不适用,虽然操作简单,但...
《实况足球2017(PES20... 第1页:展开《实况足球2017(PES2017)》中的精彩进球可以让很多玩家热血沸腾,那么下面小编就...
50岁中年必玩十大游戏推荐20... 人到中年,生活被家庭和琐事填满,忙碌之余总想来点轻松的消遣,不用费眼费神,50岁中年必玩十大游戏节奏...
卡丁车游戏有哪些介绍2026 ... 指尖驰聘风为伴,竞速逐乐无牵绊,操作简单不费脑,闲时比拼心欢颜,卡丁车游戏操作简单,节奏轻快,既能体...
武装直升机游戏哪些值得玩202... 去找到那种热血以及自由的感觉,武装直升机游戏主要说的就是一个真实以及热血的操控感,满足大家对于高空战...
十大最耐玩的3a游戏推荐202... 节奏快的时候不打紧,因为大家总可以找到让自己宽松的角落,十大最耐玩的3a游戏不需要凭借很多乱七八糟的...
龙城游戏哪些值得玩2026 质... 闲暇之余寻乐趣,龙城世界藏惊喜,龙城游戏以传奇热血为核心,融合PK竞技,养成探索等元素,凭怀旧感与高...
全网最火的手机小游戏合集 20... 全网最火的手机小游戏。不知道各位玩家有没有发现虽然现在排行榜上还是以大型手游为主,但是越来越多的玩家...
忍者神龟游戏下载合集 2026... 对于无数玩家来说,忍者神龟游戏是刻在童年记忆里的符号,从街机摇杆式操作到移动端指尖划落,这份属于纽约...