我知道Tomcat v10.1,指的是以下规格:
所以我的 Gradle 依赖项是:
dependencies {
compileOnly "jakarta.servlet:jakarta.servlet-api:6.0.0"
compileOnly "jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.0"
compileOnly "jakarta.el:jakarta.el-api:5.0.0"
}
我想 Tomcat 已经有了这些库,所以我使用
compileOnly
。
问题是我还需要添加相应的JSTL库,以支持包含JSTL标签的旧JSP文件。
在我的 JSP 文件中,我将正确的 JSTL 标记修复为:
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
现在关于导入,我添加这些依赖项:
implementation 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0'
问题是
jakarta.tags.core
无法识别,我有一个例外。
问题:
JSP 规范必须是 3.1。然而,对 Maven 的最新依赖是
jstl-api:3.0.0
(而不是不存在的 3.1.0
)。该版本符合 JSP 规范 3.1 吗?
如何修复错误?
一般来说,Tomcat 版本 10 不理解
javax.*
包中的类。因此,许多代码中包含 javax
的应用程序以及为早期版本的 Java EE 构建的应用程序(包括 servlet 和 JSP 以及 JSTL 等标签库)无法在新版本的 Tomcat 10 上运行。因此,需要重写代码并替换对旧库的所有引用,并更新描述符中的应用程序版本(如果可用)。
在 Gradle 依赖项中,您还需要删除所有对
javax
的引用。根据依赖关系,如果应用程序使用servlet-api或jsp-api,那么它必须标记为provided
,因为服务器已经有这样的lib,尽管它们是由另一个类加载器加载的,所以可能会出现类型转换错误在运行时。
对于新版本的JSTL,可以进行以下操作
dependencies {
compile 'org.glassfish.web:jakarta.servlet.jsp.jstl:3.0.1'
compile 'jakarta.servlet.jsp.jstl:jakarta.servlet.jsp.jstl-api:3.0.0'
}