1

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

  • 应该加载它需要时间

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

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

例如spring-boot-autoconfigure-2.1.6.RELEASE.jar (1.2Mb) 包含couchbasefreemakercassandra和许多其他的,有 99% 的可能性永远不会用于您的特定项目。或者spring-core-5.1.8.RELEASE.jar (1.2Mb) 包含KotlinDetector之类的类。严重地?在核心库中?我永远不会使用这种充满 OOP 反模式的丑陋语言。为什么我应该在我的应用程序中关注它?

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

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

使用jlinkGraalVM 原生镜像和原生构建的另一个想法。我发现了一堆关于那个的文章。据我了解,目前不可能将其用于 Spring Boot 应用程序。

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

问题:有没有办法从你最终的 Spring Boot jar/war 中删除所有未使用的东西?

4

1 回答 1

0

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

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

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

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

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

<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
于 2019-09-13T04:53:10.600 回答