在 Tomcat 10.x 上部署 Spring 5.x
Posted
技术标签:
【中文标题】在 Tomcat 10.x 上部署 Spring 5.x【英文标题】:Deploying Spring 5.x on Tomcat 10.x 【发布时间】:2021-11-12 23:35:13 【问题描述】:TL;DR:我有一个适用于 Tomcat 9 的 Spring MVC Hello, World! 应用程序。Tomcat 10 上的相同应用程序为 Web 请求映射提供 404 错误。
问题
将 Spring MVC 5 Hello, World! 应用程序部署到 Tomcat 10 时,应用程序会为 Web 请求映射提供 404 错误。相同的 Hello, World! 应用程序在 Tomcat 9 上运行。它在 Tomcat 9 上显示 Hello, World! 消息。
我的预期
我希望应用程序在 Tomcat 10 上显示 Hello, World! 消息。
环境
微软视窗 10 Tomcat 10.0.2 Spring MVC 5.3.3我进行的研究
我在 Spring 参考手册的 Web Servlet 部分进行了研究。我还在线测试了 Spring MVC 教程。这些教程适用于 Tomcat 9。但是,相同的教程在 Tomcat 10 上失败了。我还在 Tomcat 10 上执行了 Google 搜索。我看到了对 Jakarta EE 的引用,但我不确定这是否是问题的根源。 Java EE 8 和 Jakarta EE 8 向后兼容。
如何复制
我创建了一个非常基本的 Hello, World! 项目来测试这一点。这是我用于项目的代码。
文件 pom.xml
<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.spring</groupId>
<artifactId>example-spring</artifactId>
<version>1.0</version>
<packaging>war</packaging>
<properties>
<maven.compiler.target>11</maven.compiler.target>
<maven.compiler.source>11</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.1</version>
</plugin>
</plugins>
</build>
</project>
文件 ProjectInitializer.java
package com.example;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class ProjectInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
@Override
protected Class<?>[] getServletConfigClasses()
return new Class[] PureJavaConfig.class ;
@Override
protected String[] getServletMappings()
return new String[] "/" ;
@Override
protected Class<?>[] getRootConfigClasses()
return null;
文件 PureJavaConfig.java
package com.example;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
@Configuration
@EnableWebMvc
@ComponentScan("com.example")
public class PureJavaConfig
@Bean
public ViewResolver viewResolver()
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setSuffix(".jsp");
resolver.setPrefix("/WEB-INF/jsp/");
return resolver;
文件 TutorialController.java
package com.example;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TutorialController
@GetMapping("/")
public String home()
return "home";
文件 home.jsp
<html>
<body>Hello, World! of Spring! <%= java.time.LocalDateTime.now() %></body>
</html>
该项目在 Tomcat 9 上运行良好。它显示 Hello, World! 消息。但是,当我在 Tomcat 10 上运行时,我收到了 404 错误消息。
【问题讨论】:
没有其他细节,任何人都很难提供帮助。请拨打tour,访问help center 并阅读How to Ask,了解如何有效地使用本网站。您的错误消息意味着缺少大部分 Servlet 实现,因此可能是安装错误或配置错误。 @JimGarrison - 谢谢先生提供关于如何提问的参考。很抱歉我没有遵循正确的程序。我已经用更多细节、源代码和预期结果更新了我的问题。 既然他已经添加了所有细节,我们应该恢复我们的反对票 【参考方案1】:TL;DR:Spring MVC 5 无法在 Tomcat 10 上运行,因为包从 javax.*
重命名为 jakarta.*
。
经过进一步研究,我能够找到我的问题的答案。 Spring MVC 5不在 Tomcat 10 上工作。这是因为 Tomcat 10 基于 Jakarta EE 9,其中 API 的包名称已从 javax.*
更改为 jakarta.*
。
Tomcat 10 在download webpage 上提到了这一点:
Tomcat 10 及更高版本的用户应注意,由于 作为 Java EE 迁移到 Jakarta EE 的一部分,从 Java EE 迁移到 Jakarta EE Eclipse Foundation,所有已实现 API 的主要包 已从
javax.*
更改为jakarta.*
。这几乎肯定会 需要更改代码以使应用程序能够从 Tomcat 9 迁移 以及更早版本到 Tomcat 10 及更高版本。
对于 Spring MVC 5,Spring MVC DispatcherServlet 依赖于 javax.servlet.*
包命名空间。这是使用 Java EE 8 javax
包命名。由于 Tomcat 10 基于 Jakarta EE 9,因此不支持 javax
命名的包。这就解释了为什么 Spring MVC 5 不能在 Tomcat 10 上运行。
有针对 Spring Framework 提出的 GitHub 问题:
Spring core 5 is not starting on Tomcat 10
Support for Jakarta EE 9 (annotations and interfaces in jakarta.* namespace)
就我而言,我不会迁移到 Tomcat 10,而是继续使用 Tomcat 9,直到 Spring 框架升级到 Jakarta EE 9。
【讨论】:
在第二段写了Spring MVC 5 does currently work on Tomcat 10
。那么它有效还是无效?
@izogfif:哦,那是一个错字。这是行不通的。我添加了 not。我对我的答案进行了修改:Spring MVC 5 *not* 在 Tomcat 10 上工作。以上是关于在 Tomcat 10.x 上部署 Spring 5.x的主要内容,如果未能解决你的问题,请参考以下文章
使用 jakarta.* 包在 Tomcat 10.x 上部署 Spring 5.x
OpenSAML / Spring 安全设置,因此在 Tomcat 上重新部署有效
Spring 应用程序无法在 Tomcat 上部署:applicationContext 有啥问题?