如何从 Spring 启动应用程序中删除膨胀以减少内存占用和启动时间?



即使是简单的 Spring Boot 应用程序 jar 也包含许多依赖项和功能,您的应用程序永远不会使用这些依赖项和功能。 所有这些东西:

  • 应该加载并且需要时间

  • 其中许多类应该被实例化、初始化,并且会消耗内存和资源。

这对于微服务架构和云原生应用程序至关重要,在这些应用程序中,内存占用可能是价格(例如 https://run.pivotal.io/pricing/(和/或启动时间很重要。

例如,spring-boot-autoconfigure-2.1.6.RELEASE.jar(1.2Mb(包含couchbase,freemaker,cassandra和许多其他内容,它们有99%的概率永远不会用于您的特定项目。或者spring-core-5.1.8.RELEASE.jar(1.2Mb( 包含像KotlinDetector这样的类。认真地?在核心库中? 我永远不会使用这种充满OOP反模式丑陋的语言。我为什么要在我的应用程序中关注它?

我为什么要为所有这些无用的东西买单?

我试图使用 ProGuard 来摆脱所有未使用的类和方法。但是对于使用反射API,AOP甚至调试信息的Spring Boot,Hibernate等来说,这似乎没有办法! ProGuard甚至无法完成,没有错误地抱怨缺少某些课程。

另一个想法是使用jlink,GraalVM本机映像和本机构建。我找到了很多关于这方面的文章。据我了解,目前不可能将其用于 Spring 启动应用程序。

Spring Boot是构建应用程序的好工具。

问:有没有办法从你最终的春季靴子罐子/战争中去除所有未使用的东西?

请阅读 Spring Boot Maven 插件 它解释了如何在打包过程中排除依赖项,

默认情况下,重新打包和运行目标都将包括在项目中定义的任何提供的依赖项。Spring 引导项目应将提供的依赖项视为运行应用程序所需的容器依赖项

有两种方法可以将依赖项排除在 在运行时打包/使用

  1. 排除由 groupId 和 artifactId 标识的特定工件(如果需要,可以选择使用分类器(
  2. 排除属于给定组 ID 的任何项目

但是我怀疑您是否可以删除任何工件中的任何内容

<plugins>
...
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.8.RELEASE</version>
<configuration>
<excludes>
<exclude>
<groupId>com.foo</groupId>
<artifactId>bar</artifactId>
</exclude>
</excludes>
</configuration>
...
</plugin>
...
</plugins>

您也可以使用排除项在依赖项级别处理它

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</exclusion>
</exclusions>
</dependency

相关内容

  • 没有找到相关文章

最新更新