【问题标题】:spring boot war without tomcat embedded没有嵌入tomcat的spring boot war
【发布时间】:2014-11-17 11:08:52
【问题描述】:

我想用 maven 创建一个没有嵌入 tomcat 的 war 文件。 这是我的pom的相关部分

...
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.1.6.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-thymeleaf</artifactId>
    </dependency>
    <!-- Add tomcat only if I want to run directly -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
...

如果我运行 mvn package 我会遇到战争,其中 tomcat*.jar 位于提供的 lib 文件夹中,但仍在 lib 文件夹中。我读了build-tool-plugins-maven-packaging,但找不到问题所在。

我知道一个主要想法是将其作为应用程序运行,无论我们的客户希望如何将其部署在他的应用程序服务器上。

【问题讨论】:

  • jar 仍然存在这一事实并不意味着您不能将其部署为战争。您可以按原样完美部署它。确保从 spring-boot-starter-web 依赖项中排除 tomcat。
  • @niels,您编辑了这个问题,自修订版 2 起,它包含了您问题的答案。恢复到您最初的答案并提供单独的答案怎么样?
  • @Abdull 好主意。它使它更清晰。

标签: spring maven war spring-boot


【解决方案1】:

我不确定这是否是 spring-boot 的方式,但您可以使用 maven-war-plugin 配置排除 tomcat jar。也就是说,将以下内容添加到您的 pom.xml:

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <packagingExcludes>WEB-INF/lib/tomcat-*.jar</packagingExcludes>
            </configuration>
        </plugin>
    </plugins>
</build>

使用这种方法,生成的war是不可执行的(不能在命令行使用 java -jar 运行),只能部署到任何servlet容器中

【讨论】:

    【解决方案2】:

    根据 M. Deinum 的提示,我排除了 tomcat 依赖。

    使用以下 pom.xml(相关 sn-p)maven clean package 具有我想要得到的结果。

    ...
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.6.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <!-- Add tomcat only if I want to run directly -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
    ...
    

    idea-user 警告:您必须在运行配置中激活“在提供的范围内包含依赖项”(有关详细信息,请参阅 Unable to start spring-boot application in IntelliJ Idea

    【讨论】:

    • 但是如果spring-boot-starter-tomcat被注释掉了,怎么运行app呢?我以这种方式尝试过,并将其部署到 tomcat 容器中,但随后收到错误消息。所有类似于:org.apache.catalina.startup.ContextConfig checkHandlesTypes 警告:无法加载类 [org.apache.tomcat.util.descriptor.web.NameRule] 以检查一个或多个 ServletContentInitializer 的 @HandlesTypes 注释。 java.lang.ClassNotFoundException: org.apache.tomcat.util.descriptor.web.NameRule 等
    • 您可以在任意 servlet 容器中部署战争。如果您的应用程序不需要 tomcat 类,它可以正常工作。您是否可能在编译时需要 tomcat 类?你如何编译?来自命令行的 mvn?确保在开始时进行 mvn clean。
    • 我用的是 gradle,不过我已经弄明白了。构建过程 (bootRepackage) 生成两个工件,一个带有嵌入式 Tomcat 容器,一个不带有嵌入式 Tomcat 容器。原来我为外部 Tomcat 部署使用了错误的工件 - 那么应该在没有嵌入式 Tomcat 的情况下进行战争。
    • 太棒了!非常感谢。
    • 当我使用上述建议运行我的应用程序时,它给了我错误“在关机时取消注册 JMX 暴露的 bean”
    【解决方案3】:

    我也有同样的需求,但删除提到的依赖项并没有奏效。我可以通过将此 &lt;packaging&gt;war&lt;/packaging&gt; 依赖项添加到我的 pom 文件中来获取 WAR 文件。

    我使用这篇 Spring 文章作为指南...分享,这样也可以帮助其他人。

    【讨论】:

      【解决方案4】:

      更改 spring-boot-starter 依赖项
         <dependency>
              <groupId>org.springframework.boot</groupId>
              <artifactId>spring-boot-starter</artifactId>
          </dependency>
      

      到这个会排除嵌入式tomcat服务器。

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

      【讨论】:

        【解决方案5】:

        我认为在没有嵌入式 Tomcat 的情况下从现有 Spring Boot 项目构建最终 WAR 的最简单方法如下:

        1) 为您的工件设置 WARpackaging:&lt;packaging&gt;war&lt;/packaging&gt;

        2) 设置Tomcat Server依赖提供:

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

        如果您现有的一些 Spring Boot 依赖项默认包含它,只需将其排除。示例:

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

        就是这样。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-03-10
          • 2018-12-05
          • 2020-06-11
          • 2018-12-31
          • 1970-01-01
          • 2019-12-01
          • 2018-05-28
          • 2015-10-01
          相关资源
          最近更新 更多