Java 11 Spring Boot项目无法导入JSTL标签库求助
我之前在做类似的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,比如:
这样既不会影响JSTL的TLD加载,又能避免jaxws的旧TLD产生警告。server.tomcat.additional-tld-skip-patterns=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




