SpringBoot应用瘦身记,兼从maven迁移到gradle手记

news/2024/11/18 2:24:32/

目录

    • 前言
    • 步骤
      • 选择合适的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

http://www.ppmy.cn/news/3828.html

相关文章

音视频- iOS使用metal渲染图像(一)

概要 本文主要总结一下Metal的基本使用,用来渲染拍照的到的图像,其中涉及到的有UIKit中的MTKView,Metal中负责渲染的几个类,使用MSL(Metal Shading Language)编写着色器,最终将图片渲染出来…

三面美团 Java 岗,HR 现场直接发 offer,他是横着走出来的

前情提要 这是一个发生在我朋友身上的真实事情: 这里就叫他程序员 Y 吧。 程序员 Y 工作不到两年,周末在朋友圈发了个喜报,准备入职美团。 之后,我就带着祝福跟 Y 聊了许久,聊天的内容就是具体了解一下他面试的过程…

Python实现批量采集美女视*频 <无水印>

前言 大家早好、午好、晚好吖 ❤ ~ 我给大家准备了一些资料,包括: 2022最新Python视频教程、Python电子书10个G (涵盖基础、爬虫、数据分析、web开发、机器学习、人工智能、面试题)、Python学习路线图等等 直接在文末名片自取即可&#x…

python大作业高分项目--射击闯关游戏

项目功能: 地图编辑器:可以实现玩家自己定义每一关卡的样式和难易程度 运行界面:实现了玩家的移动,跳跃,发射子弹,投掷手雷,以及敌人的AL(移动,发射子弹,扔…

【大数据技术Hadoop+Spark】MapReduce概要、思想、编程模型组件、工作原理详解(超详细)

MapReduce是Hadoop系统核心组件之一,它是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算,是目前分布式计算模型中应用较为广泛的一种。 一、MapReduce核心思想 MapReduce的核心思想是“分而治之”。所谓“分而治之…

PostgreSQL的学习心得和知识总结(一百一十七)|语法级自上而下完美实现MySQL数据库的 label:loop 的实现方案

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库链接,点击前往 4、日本著名PostgreSQL数据库专家 铃木启修 网站…

测试用例等级怎么划分?别再傻傻的一脸懵逼

我们都知道测试工程师最基本的能力便是编写测试用例,可是看似简单的用例,后面其实蕴含这个很多人忽略的细节,今天就来说测试里面所蕴含的很多细节。 很多时候不只是测试和测试用例息息相关,开发,产品也有的时候对于测试…

类加载器、类加载器的过程、类加载的分类、双亲委派模型

文章目录1.类加载器1.1类加载器1.2类加载的过程1.3类加载的分类1.4 双亲委派模型1.5 ClassLoader 中的两个方法1.类加载器 1.1类加载器 作用 负责将.class文件(存储的物理文件)加载到内存中 1.2类加载的过程 类加载时机 创建类的实例(对象…