【发布时间】: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