如何在 JakartaEE 中使用 JSTL 错误:jakarta.tags.core 无法识别

问题描述 投票:0回答:1

我知道Tomcat v10.1,指的是以下规格:

  • Servlet 6.0
  • JSP 3.1
  • EL 5.0

所以我的 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 吗?

  • 如何修复错误?

java jsp jakarta-ee jstl
1个回答
0
投票

一般来说,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'
}
© www.soinside.com 2019 - 2024. All rights reserved.