当前位置: 首页 > 知识库问答 >
问题:

用于Spring Boot应用程序的轻量级可部署WAR

干浩阔
2023-03-14

一个简单的Spring Boot应用程序仅打印一个“Hello World”,当它打包为一个可部署的WAR时,它的大小为11.5MB。当我爆发战争时,WEB-INF/lib文件夹是库太多的根本原因。

  1. 如何仅使用最少的必需/依赖库创建WAR?
  2. 在提到spring-boot-starter-tomcat的作用域时,嵌入式Tomcat服务器是否仍与WAR一起打包?

我在玩Spring测试套件(STS)附带的'gs-spring-boot-complete'项目,下面是附带的默认POM。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.springframework</groupId>
    <artifactId>gs-spring-boot</artifactId>
    <version>0.1.0</version>
    <!-- ... -->
    <packaging>war</packaging>
    <!-- ... -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.10.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>

        <!-- tag::actuator[] -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- end::actuator[] -->
        <!-- tag::tests[] -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- end::tests[] -->
    </dependencies>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <artifactId>maven-failsafe-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>integration-test</goal>
                            <goal>verify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

更新:我从POM中删除了对spring-boot-starter-tomcat和spring-boot-starter-actuctor的依赖,仍然是11.5MB。

目前只有两个直接依赖关系spring-boot-starter-web和spring-boot-starter-test(我知道这可能反过来有其他依赖关系)。

我的问题是,即使我不打算拥有嵌入式Tomcat容器,“Spring Boot”应用程序是否会生成如此巨大的可部署战争?我试图确认是否有任何事情可以做,以有一个优化的(我的意思是小型)可部署的战争。

共有1个答案

应向晨
2023-03-14

如果您不想将应用程序作为可执行war文件运行,只想将其部署到servlet容器中,那么您可以删除Spring Boot的Maven插件,并声明spring-boot-starter-tomcat为提供的依赖项:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>example-app</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.2.1.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>       
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

删除Spring Boot的Maven插件将防止提供的依赖项打包到war文件中。使spring-boot-starter-tomcat成为提供的依赖项,而不是完全排除它,将允许您使用嵌入式Tomcat运行集成测试。

这将给出一个7.6MB的war文件。根据您的应用程序和希望使用的技术,您可能还需要考虑排除spring-boot-starter-web的一些可传递依赖项。例如,它引入了Hibernate Validator(>0.5MB)和Jackson(>1MB)。

 类似资料:
  • 完成干净的构建后,我将war文件复制到Tomcat的文件夹中。但是部署会发生两次,并且在上下文已经存在的情况下以异常结束。我错过了什么? 非常感谢您的帮助。

  • 尝试在Heroku云中部署Spring Boot应用程序,但编译java应用程序时出现错误,但在我的本地计算机中运行良好。

  • Requirements 运行一个Spark Streaming应用程序,有下面一些步骤 有管理器的集群-这是任何Spark应用程序都需要的需求,详见部署指南 将应用程序打为jar包-你必须编译你的应用程序为jar包。如果你用spark-submit启动应用程序,你不需要将Spark和Spark Streaming打包进这个jar包。 如果你的应用程序用到了高级源(如kafka,flume),你需

  • 同时,当前稳定的Debian版本仍然没有Java 11软件包(Ubuntu在openjdk-11软件包下安装了Java10),这就是为什么不稳定的sid版本被用于基本docker映像 当前可用的Oracle openjdk-11映像构建未剥离的模块,该模块具有数百兆字节,必须单独剥离: 从openjdk创建的JLink运行时映像大小(特别是libjvm.so)非常大。预期它会小得多。 解决方案:h

  • 问题内容: 受问题启发,为什么Java 11基本Docker映像这么大?(openjdk:11-jre-slim)我发现Java世界中的这个话题仍然没有解决。 至于常见问题/陷阱(在上面的票证中讨论): JRE没有作为单独的“包”分发。应改用JDK的模块 Oracle OpenJDK 11不支持Linux Alpine,因此无法轻松创建 轻量级 映像 同时,当前稳定的Debian版本仍然没有Jav