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

时间:2015-02-17 15:17:05

标签: spring maven spring-boot

一个简单的Spring Boot应用程序,它只打印一个" Hello World"打包为可部署的WAR时为11.5 MB。当我爆炸WAR时,web-inf / lib文件夹是导致库太多的根本原因。

  
      
  1. 如何使用最少的必需/从属库创建WAR?
  2.   
  3. 虽然提及 提供 作为 spring-boot-starter-tomcat 的范围,但是嵌入式Tomcat服务器是否存在?仍然与WAR一起打包?
  4.   

我正在玩#gs-spring-boot-complete' Spring Test Suite(STS)附带的项目,这是随附的默认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-actuator 的依赖关系,但WAR仍为11.5 MB。

目前只有2个直接依赖 spring-boot-starter-web &amp; spring-boot-starter-test (据我所知,这可能会产生其他依赖关系)。

  

我的问题是,即使我不打算使用嵌入式Tomcat   容器,做&#34; Spring Boot&#34;应用程序产生如此巨大   可部署的WAR?我想确认是否有任何东西   可以做一个优化(我的意思是小型)可部署的WAR。

2 个答案:

答案 0 :(得分:5)

如果您没有兴趣将应用程序作为可执行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的战争文件。根据您的应用程序和要使用的技术,您可能还需要考虑排除某些spring-boot-starter-web的传递依赖项。例如,它正在吸收Hibernate Validator(> 0.5MB)和Jackson(> 1MB)。

答案 1 :(得分:0)

目的是创建一个包含所有依赖项的war / jar。您想要部署的最低要求是什么?

我建议删除tomcat和执行器依赖关系以启动 - 然后重新检查大小