【问题标题】:Using Spring Boot 2.0 with Tomcat 7.0.82将 Spring Boot 2.0 与 Tomcat 7.0.82 一起使用
【发布时间】:2018-08-07 00:15:09
【问题描述】:

我有一个使用 Spring Boot 2.0.0.RC2 的项目。我需要使用 Tomcat 7.0.82 的传统部署将其部署到客户环境。 我已经设法通过为 Spring 应用程序(使用 DispatcherServlet)以典型方式配置 web.xml 而不是使用 SpringBootServletInitializer 来成功部署战争。

我还想有一种使用嵌入式 Tomcat 容器在本地环境中启动应用程序的快速方法,只需在应用程序类中运行带有 @SpringBootApplication 注释的 main 方法即可。如果我使用默认的 Tomcat 版本(8.5.28),它工作正常。但是,我也想在 7.0.82 版本中启动嵌入式容器。这对我来说很重要还有另一个原因——我正在使用 SpringBootTest,如果这些测试在与客户环境完全相同的容器上运行,那就太好了。不幸的是,我不能使用 Spring Boot 父 POM 并覆盖 tomcat.version 属性。

我试过@SpringBootApplication(exclude = ServletWebServerFactoryAutoConfiguration.class)手动创建TomcatServletWebServerFactory bean

@Bean
public ServletWebServerFactory tomcatServletWebServerFactory() {
    return new TomcatServletWebServerFactory();
}

并在pom.xml (${tomcat.version} = 7.0.82) 中显式添加tomcat 7.0.82 依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-annotations-api</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-el</artifactId>
        </exclusion>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-websocket</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-annotations-api</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-util</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-el</artifactId>
    <version>${tomcat.version}</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-websocket</artifactId>
    <version>${tomcat.version}</version>
</dependency>

但我仍然收到 java.lang.NoClassDefFoundError: org/apache/tomcat/util/scan/StandardJarScanFilter 错误。

请问有什么方法可以满足我的要求吗?

【问题讨论】:

  • 通过将 Spring Boot 降级到 1.5 分支。 Spring Boot 2.0,需要一个 Servlet 3.1 容器。 Tomcat 7 是一个 Servlet 3.0 容器。
  • 如果可能,我想避免它——我更愿意为 Spring Boot 2.0 找到解决方案,因为我想支持 JUnit5。
  • Spring Boot 2,需要 Spring 5,后者需要 Servlet 3.1 容器。您唯一的选择是降级,如果仅适用于 jUnit 5,那么 jUnit 5 也支持 Spring 4.3。见github.com/sbrannen/spring-test-junit5。或者升级到Tomcat 8.5(也就是官方的3.1容器)。
  • @M.Deinum - 我将版本降级为 1.5.10.RELEASE,现在我拥有 7.0.82 版本的嵌入式容器。但有趣的是,我查看了 Spring Boot 1.5.10.RELEASE 也在 3.1.0 版本中使用 Servlet API 的依赖版本。知道为什么它适用于 1.5.10.RELEASE 而不是 2.0.0.RC2 吗?
  • 因为它不是 Servlet 3.0 API 所需的最低版本。

标签: spring-boot embedded-tomcat-7


【解决方案1】:

春季启动 2: Tomcat 支持的最低版本为 8.5

参考:https://dzone.com/articles/spring-boot-20-new-features-infrastructure-changes

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 2020-03-09
  • 2011-04-16
  • 2016-01-29
  • 1970-01-01
  • 2015-11-03
  • 2016-12-27
  • 2017-03-21
相关资源
最近更新 更多