You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java 11 Spring Boot项目无法导入JSTL标签库求助

解决Java 8到Java 11迁移中JSTL标签URI解析错误与jaxws-rt冲突问题

我之前在做类似的Java版本迁移项目时,碰到过几乎一模一样的问题,结合你的场景给你几个能同时解决两个问题的方案:

1. 统一更新标签库URI到Jakarta规范

你现在用的是Jakarta版本的JSTL依赖(jakarta.servlet.jsp.jstl-api),但页面里还是沿用旧Java EE时代的URI(http://java.sun.com/jsp/jstl/core),这是核心矛盾之一。Tomcat加载时会因为命名空间不匹配,找不到对应的标签定义。

把页面里的标签声明全部替换成Jakarta对应的URI:

  • JSTL核心标签:
    <%@ taglib prefix="c" uri="http://jakarta.tags.core" %>
    
  • Spring Security标签:
    如果你之前用的是http://www.springframework.org/security/tags,这个在Spring Boot 2.2.4(对应Spring Security 5.2.x)中仍兼容,但如果还是报错,可以确认下spring-security-taglibs依赖版本和Spring Boot版本完全匹配即可,无需修改URI。

2. 解决jaxws-rt与Tomcat的依赖冲突

你提到注释掉jaxws-rt的Tomcat配置后JSTL问题消失,但出现警告,说明jaxws-rt的依赖里引入了旧的Java EE(javax开头)的Servlet/JSP相关jar包,和你现在用的Jakarta(jakarta开头)的JSTL/Servlet依赖产生了类加载冲突,导致Tomcat无法正确识别JSTL的TLD文件。

具体操作:

  • 首先在jaxws-rt的依赖中排除所有旧的javax相关冲突依赖:
    <dependency>
        <groupId>com.sun.xml.ws</groupId>
        <artifactId>jaxws-rt</artifactId>
        <version>你的jaxws版本号</version>
        <exclusions>
            <!-- 排除旧的Servlet API依赖 -->
            <exclusion>
                <groupId>javax.servlet</groupId>
                <artifactId>javax.servlet-api</artifactId>
            </exclusion>
            <!-- 排除旧的JAX-WS API依赖 -->
            <exclusion>
                <groupId>javax.xml.ws</groupId>
                <artifactId>jaxws-api</artifactId>
            </exclusion>
            <!-- 如有其他javax开头的冲突依赖,都可以排除 -->
        </exclusions>
    </dependency>
    
  • 然后添加Jakarta版本的JAX-WS API依赖,替代被排除的旧依赖:
    <dependency>
        <groupId>jakarta.xml.ws</groupId>
        <artifactId>jakarta.xml.ws-api</artifactId>
        <version>2.3.3</version> <!-- 该版本与Spring Boot 2.2.4兼容 -->
    </dependency>
    
  • 调整Tomcat的类加载配置(如果之前的配置是为了解决jaxws的类加载问题):
    如果之前在application.properties或者Tomcat插件里加了类似server.tomcat.additional-tld-skip-patterns的配置,把JSTL的TLD从跳过列表中移除,改成只跳过jaxws相关的旧TLD,比如:
    server.tomcat.additional-tld-skip-patterns=jaxws*.tld
    
    这样既不会影响JSTL的TLD加载,又能避免jaxws的旧TLD产生警告。

3. 验证依赖树,清理重复依赖

用IntelliJ IDEA的Maven Helper插件查看项目依赖树,确保没有同时存在javax.servlet.*jakarta.servlet.*的重复依赖,尤其是JSTL和Servlet API相关的,把所有旧的javax依赖都排除掉。

4. 检查IDE运行配置

在IntelliJ IDEA中,确保项目的SDK是AdoptOpenJDK 11,运行配置里的JRE也是Java 11,并且没有手动添加旧的Java EE jar包到项目库中。

按照这个步骤操作后,应该能同时解决JSTL标签解析错误和jaxws-rt的启动警告问题。

内容的提问来源于stack exchange,提问作者Johnczek

火山引擎 最新活动