在现代Java Web开发中,构建和部署胖JAR大型文件可能存在明显的缺点。HubSpot工程团队创建了一篇 精彩的博客文章 ,解释了他们在将大型胖JAR持续部署到AWS云时,内部开发循环和网络带宽使用带来的一些挑战。
该博客解释了团队最初如何使用Maven Shade插件来构建和打包应用程序,但这使得一个应用程序包含70个类文件 - 在原始JAR中总计210 KB,不包含任何依赖项 - 转换为150多MB大小的肥胖Jar。使用Shade将100,000多个文件合并到一个存档中也是一个缓慢的过程,然后当构建服务器将生成的JAR复制并部署到AWS S3存储服务时,这会消耗时间和网络资源。HubSpot团队拥有100名工程师,每天不断提交并触发1,000-2,000次构建,这种情况得到了放大。他们每天产生50-100 GB的构建工件!
HubSpot团队最终创建了一个新的Maven插件: SlimFast 。这个插件与Shade插件的不同之处在于它将应用程序代码与相关的依赖项分开,因此构建并上传两个单独的工件。单独构建和上载应用程序依赖项可能听起来效率低下,但只有在依赖项发生更改时才会执行此步骤。由于依赖项不经常更改,HubSpot团队声明此步骤通常是无操作; 包依赖关系的JAR文件只上传到S3一次。
HubSpot博客文章和相应的GitHub存储库提供了全面的详细信息,但实际上,SlimFast插件使用Maven JAR插件向Skinny JAR添加一个Class-Path清单条目,指向依赖项的JAR文件,并生成一个JSON文件有关S3中所有依赖项工件的信息,以便以后可以下载这些工件。在部署时,HubSpot团队会下载所有应用程序的依赖项,但随后会在每个应用程序服务器上缓存这些工件,因此这一步骤通常也是无操作。最终结果是在构建时只上传了应用程序的瘦小JAR,这只是几百千字节。在部署时,只需要下载相同的瘦JAR,这需要几分之一秒。
SlimFast插件目前与AWS S3绑定用于存储工件,但代码可在GitHub上获得,其原理可适用于任何类型的外部存储。