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

相关内容

热门资讯

免费交友聊天软件推荐 2026... 如今社交节奏日益加快,人与人之间的真实互动却在悄然减少。许多人渴望一个轻松、低门槛的线上交流空间,既...
英语单词跟读软件推荐|高效提升... 在家自学英语时,高效记忆单词离不开科学的发音训练与跟读练习。以下几款专注英语单词跟读的学习类应用,均...
实用的飞机App推荐 2026... 飞机作为高效快捷的交通方式,虽能大幅缩短旅途时间,但航班延误、取消等突发状况频发,旅客往往抵达机场后...
汽车配件APP推荐 2026高... 私家车主日常保养爱车、汽修门店批量采购配件,都离不开专业可靠的汽车配件选购工具。针对安卓用户,市面上...
写小说软件推荐 人气高且好用的... 专为移动端优化的小说创作工具,能够高效满足网络文学作者及业余写作爱好者的多样化需求。这类应用支持碎片...
短视频APP排名汇总 2026... 挑选适合安卓手机的短视频应用时,用户普遍关注设备兼容性、内容质量以及操作流畅度等核心体验。在众多选择...
好用的飞机App安卓下载推荐 ... 对于长途旅行或跨境出行,飞机无疑是效率最高、覆盖最广的交通方式。然而,购票流程繁琐、值机手续复杂等问...
酒店预订哪个软件便宜 2026... 旅行前做好酒店预订,是保障旅途舒适度的重要环节。除了规划行程路线,提前锁定性价比高的住宿,能让返程后...
二手手表交易平台App推荐 2... 当前市场上,不少钟表爱好者手中积攒了多款品质优良的二手名表,有意向转手变现或寻找心仪新款。此时选择一...
不休的勇士刺客怎么玩 不休的勇... 不休的勇士刺客怎么玩?万灵大陆光影交错,刺客这个职业,一直都挺神秘的,他们不像战士那样直接冲锋,也不...