当前位置: 首页 > 科技观察

从无到有搭建开发脚手架,SpringBoot应用瘦身打包轻松部署

时间:2023-03-14 18:57:01 科技观察

本文转载请联系Java大厂面试官公众号。后台的工作原理通过运行应用程序进行预热来额外补充。编译时使用Maven打包依赖。生产环境后台SpringBoot默认的Jar包含了应用代码及其所有的依赖(tomcat自带的jar不小),所以打包出来的jar文件非常大,几十到几百兆不等,堪称一个胖子罐。在网速不给力的情况下,上传到服务器非常耗时。而我们引用的Tomcat、Spring等第三方组件,大部分时间不会修改,占用空间大,而且每次都是打包打出来的。其实我们经常改的内容都是自己写的代码,大小只有几十KB。我们只需要在每次升级时替换这些文件即可。Spring社区大概也考虑到了开发者的需求,所以提供了插件spring-boot-thin-launcher,将项目的依赖和配置从jar包中分离出来。使用官网地址:https://github.com/spring-projects-experimental/spring-boot-thin-launcher在SpringBootpom文件中添加新插件如下:<插件><插件>org.springframework.bootspring-boot-maven-pluginorg.springframework.boot.experimentalspring-boot-thin-layout1.0.27.RELEASE然后像之前一样执行mvncleanpackage,生成的jar包只有几十KB。我这里静态文件比较多,因为项目比较大,有2MB。执行java-jarxxx.jar直接运行程序。除了jar文件变小,其他效果和Fatjar一样。试用之后,我们再来看看它的内部原理。工作原理下面我们来看看Jar包的内部构成。Manifest-Version:1.0Implementation-Title:mapImplementation-Version:0.0.1-SNAPSHOTStart-Class:com.laker.map.LakerMapApplicationSpring-Boot-Classes:Build-Jdk-Spec:1.8Spring-Boot-Version:2.3.7。RELEASECreated-By:MavenJarPlugin3.2.0Main-Class:org.springframework.boot.loader.wrapper.ThinJarWrapper其实就是启动类:ThinJarWrapperThinJarWrapper类我们写的代码工程的pom文件java-jarxxx.jar执行的时候,它实际上执行的ThinJarWrapper就是ThinJarWrapper,它会先在指定的目录下搜索,看是否所有依赖的jar包都存在。如果存在,直接使用。如果不存在,先从Maven中央仓库下载到本地,然后执行自己写的main()。进入方式。这种方法有点类似于很多在线安装程序:用户下载后得到的是一个非常小的exe安装程序。在执行安装程序时,他们会先在网上下载几个需要的大文件,然后再进行实际安装。这个spring-boot-thin-launcher启动时默认搜索的目录是用户家目录的.m2。我们也可以指定下载目录,比如指定下载目录为当前目录:java-Dthin.root=.-jarxxx。jar执行后发现在当前目录下自动生成了一个repository目录,这个目录和Maven默认的下载目录~/.m2/repository一模一样,只是只包含了xxx需要的运行时依赖。罐。repository/com/net/org/...》注意:第一次运行时只会自动下载依赖,再次运行时不需要下载,启动速度会大大加快。如果repository目录被删除,它会在再次运行时重新启动触发下载。额外运行应用程序以预热缓存依赖项的最简单方法是在目标环境中对应用程序进行预热运行。正如我们之前看到的,这将导致依赖项被下载并缓存在存储库中的Maven本地。如果我们运行多个应用程序,存储库最终将包含所有依赖项而没有重复项。由于运行应用程序可能会产生不需要的副作用,我们还可以执行“试运行”,它只解析和下载依赖项而不运行任何用户代码:java-Dthin.dryrun=true-Dthin.root=.-jarxxx.jar使用Maven在编译时打包依赖添加如下依赖.version}resolveresolvefalse构建项目后,目录为target/thin/root/。生产环境在生产环境中,大部分与内外网隔离。建议先在本地“试运行”,然后将repository目录和thinjar复制到服务器,设置thin.root指定目录,设置thin.offline切换到“离线”模式。所有依赖项都必须在本地可用。java-Dthin.root=.-Dthin.offline=true-jarxxx.jar参考:https://www.liaoxuefeng.com/wiki/1252599548343744/1304267002478625