Java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.BodyTagSupport

У меня есть следующий код в файле JSP для тегов, который включен во все мои файлы JSP вверху:

<%@ taglib uri = "http://struts.apache.org/tags-bean" prefix = "bean"%>
<%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
<%@ taglib uri = "http://struts.apache.org/tags-logic" prefix = "logic"%> 
 
<%@ taglib uri = "http://java.sun.com/jsp/jstl/core" prefix = "c"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/fmt" prefix = "fmt"%>
<%@ taglib uri = "http://java.sun.com/jsp/jstl/functions" prefix = "fn"%>

<%@ taglib uri = "http://displaytag.sf.net" prefix = "display"%>

<%@ taglib uri = "http://www.springframework.org/tags" prefix = "spring"%>
<%@ taglib uri = "http://www.springframework.org/security/tags"
    prefix = "sec"%>
<%@ taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%>
<%@ taglib uri = "http://www.springmodules.org/tags/commons-validator"
    prefix = "v"%>
<html:xhtml />
<c:set var = "ctx" value = "${pageContext.request.contextPath}" />

Поскольку я недавно перешел с Spring 5.X на Spring 6, я изменил приведенное выше на следующее в соответствии со спецификацией Джакарты 3.0, указанной здесь:

<%@ taglib uri = "http://struts.apache.org/tags-bean" prefix = "bean"%>
<%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
<%@ taglib uri = "http://struts.apache.org/tags-logic" prefix = "logic"%> 

<%@ taglib uri = "jakarta.tags.core" prefix = "c"%>
<%@ taglib uri = "jakarta.tags.fmt" prefix = "fmt"%>
<%@ taglib uri = "jakarta.tags.functions" prefix = "fn"%>

<%@ taglib uri = "http://displaytag.sf.net" prefix = "display"%>

<%@ taglib uri = "http://www.springframework.org/tags" prefix = "spring"%>
<%@ taglib uri = "http://www.springframework.org/security/tags"
    prefix = "sec"%>
<%@ taglib uri = "http://www.springframework.org/tags/form" prefix = "form"%>
<%@ taglib uri = "http://www.springmodules.org/tags/commons-validator"
    prefix = "v"%>
<html:xhtml />

<c:set var = "ctx" value = "${pageContext.request.contextPath}" />

Тем не менее, я все еще получаю следующую ошибку при доступе к странице JSP.

[INFO] SEVERE: Servlet.service() for servlet [myapp] in context with path [/myapp] threw exception [java.lang.NoClassDefFoundError: javax/servlet/jsp/tagext/BodyTagSupport] with root cause
[INFO] java.lang.ClassNotFoundException: javax.servlet.jsp.tagext.BodyTagSupport

Вот несколько актуальных вещей из моего pom.xml:

    <dependency>
        <groupId>jakarta.servlet.jsp.jstl</groupId>
        <artifactId>jakarta.servlet.jsp.jstl-api</artifactId>
        <version>3.0.0</version>
    </dependency>
    <dependency>
        <groupId>jakarta.servlet</groupId>
        <artifactId>jakarta.servlet-api</artifactId>
        <version>6.0.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>jakarta.platform</groupId>
        <artifactId>jakarta.jakartaee-api</artifactId>
        <version>10.0.0</version>
        <scope>provided</scope>
    </dependency>
   <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>3.0.1</version>
   </dependency>
    

    

Я использую Tomcat 10.1.25, чтобы запустить указанное выше приложение. Есть ли что-то, что мне нужно перепроверить или сделать неправильно? Я просмотрел другие посты, похожие на это, и, похоже, меня удовлетворяет то, что там упомянуто.

Примечание. Struts больше не используется в приложении, хотя у меня есть некоторые объявления в приложении, и я удалю их остатки после устранения этой проблемы.

Tomcat 10.1 использует спецификацию сервлета 6 и поэтому больше javax не предусмотрено. Я предполагаю, что проблема в какой-то устаревшей библиотеке, которая все еще использует импорт javax в своем коде - просмотрите все свои библиотеки и обновите их.

J Asgarov 20.07.2024 09:52

Я полагаю, что эти устаревшие библиотеки могут быть связаны с вещами, связанными со стойками, которые я больше не использую?

Tan 20.07.2024 21:38

И что такое «Tomcat 10.1.45»? Это опечатка?

Roman C 22.07.2024 15:17

Да, я использовал 10.1.25. Отредактировал свой пост, указав правильную версию.

Tan 22.07.2024 17:06

Тогда вам следует обновить его, используя мой ответ ниже. Также не забудьте принять и проголосовать за него.

Roman C 22.07.2024 21:19
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите соответствовать спецификации Jakarta Pages, вам следует удалить старые определения библиотеки тегов Struts и Display:

<%@ taglib uri = "http://struts.apache.org/tags-bean" prefix = "bean"%>
<%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>
<%@ taglib uri = "http://struts.apache.org/tags-logic" prefix = "logic"%> 

<%@ taglib uri = "http://displaytag.sf.net" prefix = "display"%>

И вам следует удалить среду выполнения и скомпилировать зависимости от них.

Удалите использование тегов со страниц JSP, таких как

<html:xhtml />

Также, если вы используете Jakarta EE 10, вам следует установить последнюю версию Выпущен Tomcat 10.1.26 2024 г.:

Проект Apache Tomcat с гордостью сообщает о выпуске версии 10.1.26 Apache Tomcat. В этом выпуске реализованы спецификации, являющиеся частью платформы Jakarta EE 10.

Можно ли избавиться от <html:xhtml /> и со стойками? Я не понимаю, для чего там <html:xhtml />, ведь не я создал его много лет назад.

Tan 20.07.2024 21:37

Вопрос №2: Когда вы говорите If you want to comply to Jakarta Standard Tag Library 3.0 specification then you should remove old JSTL, я уже переименовал URI java.sun.com taglib в новые jakarta.tags.* URN, как показано в моем посте. Вы также имели в виду, что есть аналогичная замена стоек, которая сейчас у меня есть в комплекте?

Tan 20.07.2024 22:11

продолжение ... Причина, по которой я спрашиваю, заключается в том, что у меня есть один проект, в котором стойки не используются, и другой проект, в котором стойки используются. Таким образом, проект, содержащий некоторые из приведенных выше объявлений pom, используется как зависимость с двумя проектами (один, где стойки больше не используются, но есть остатки, как в случае с приведенным выше сценарием, и другой проект, где стойки все еще используются, и я сделал использование устаревших веб-структур для сохранения его работоспособности после обновления с Spring 5.x до Spring 6)

Tan 20.07.2024 22:11

Да, но вы не удалили все зависимости от него. По размещенной вами ссылке есть руководство, позволяющее изучить основы использования JSTL в Jakarta EE. Меня не волнует, используете ли вы Struts в своем проекте или нет, но вам следует удалить зависимости от него, поскольку текущая версия Struts несовместима с jakarta-ee. Рано или поздно Struts 7 будет выпущен, и вы сможете использовать его с Spring 6. Но ваша устаревшая версия Struts устарела несколько десятилетий назад, и вы до сих пор не обновили ее до более новой версии, поэтому вы не можете использовать ее в текущей версии. программное обеспечение. Таким образом, у вас есть только один вариант удалить его вообще.

Roman C 21.07.2024 10:52

В любом случае вы не можете использовать одни и те же объявления pom в двух проектах. Пока обе библиотеки проекта не будут поддерживать спецификацию Jakarta EE. Struts1 является EOL, поэтому он никогда не будет поддерживать последнюю версию Jakarta EE. Однако версия 1.0 — это издание Jakarta Struts (2 десятилетия назад). Вы можете сохранить старое приложение Struts как отдельное приложение, поскольку интеграция обоих не рекомендуется. Мой ответ смотрите здесь.

Roman C 22.07.2024 14:47

Спецификация указана в деталях документа.

Roman C 22.07.2024 15:11

Есть ли документация, показывающая, что будет JSTL-эквивалентом тегов Struts, которые используют <%@ taglib uri = "http://struts.apache.org/tags-html" prefix = "html"%>? По сути, у меня есть используемые теги <html:submit/> , <html:messages/> , <html:javascript /> `, от которых я пытаюсь избавиться. Я заполучил те, которые начинаются с bean и logic, и задался вопросом о приведенном выше.

Tan 30.07.2024 22:19

Другие вопросы по теме