Ошибка: Банка Сервлета не Загруженный Незаконный класс …: javax/servlet/Servlet.class

Я получаю следующую ошибку:

ИНФОРМАЦИЯ: validateJarFile (C:\dev\server\tomcat6\webapps Sempedia\WEB-INF\lib\servlet-api.jar) - банка, не загруженная. Посмотрите Спецификацию 2.3 Сервлета, sectoin 9.7.2. Оскорбление класса: javax/servlet/Servlet.class

Существующие ресурсы там говорят, что это происходит из-за конфликта с servlet.jar или в моем случае, названном файлом сервлета-api.jar. Я удалил все другие проекты из / папки веб-приложений, я взял файл сервлета-api.jar, который был в tomcat6/lib каталоге и добавил, что и только что к пути сборки проекта, таким образом, я не вижу, как существует все еще конфликт.

Когда я пытаюсь запустить приложение, я получаю следующее отслеживание стека.

org.apache.jasper. JasperException: Не мог скомпилировать класс для JSP:

Ошибка произошла в строке: 22 в сгенерированном Java регистрируют метод getJspApplicationContext (ServletContext), не определено для типа JspFactory

Stacktrace:

org.apache.jasper.compiler. DefaultErrorHandler.javacError(DefaultErrorHandler.java:92) org.apache.jasper.compiler. ErrorDispatcher.javacError(ErrorDispatcher.java:330) org.apache.jasper.compiler. JDTCompiler.generateClass (JDTCompiler.java:439) org.apache.jasper.compiler. Compiler.compile (Компилятор java:334) org.apache.jasper.compiler. Compiler.compile (Компилятор java:312) org.apache.jasper.compiler. Compiler.compile (Компилятор java:299) org.apache.jasper. JspCompilationContext.compile(JspCompilationContext.java:586) org.apache.jasper.servlet. JspServletWrapper.service(JspServletWrapper.java:317) org.apache.jasper.servlet. JspServlet.serviceJspFile(JspServlet.java:342) org.apache.jasper.servlet. JspServlet.service(JspServlet.java:267) javax.servlet.http. HttpServlet.service(HttpServlet.java:717)

30
задан Raedwald 13 February 2015 в 13:00
поделиться

3 ответа

Вам не разрешается устанавливать классы, которые переопределяют те, которые определены в спецификации сервлета, предоставляемого веб-контейнером. Вы можете скачать спецификацию с

http://www.jcp.org/aboutJava/communityprocess/final/jsr053/

и проверить это самостоятельно. Раздел 9.7.2 находится на физической странице 63.

Сервлет 2.3 является довольно старой версией, указывающей на древнюю версию Tomcat. Есть ли какая-либо конкретная причина, по которой вы не используете более новую версию?

.
4
ответ дан 27 November 2019 в 23:33
поделиться

Первое сообщение об ошибке, которое вы получили, потому что Tomcat не нужно загружать банку с сервлетами, так как она уже есть и хочет избежать конфликтов.

Обычно вы можете безопасно проигнорировать предупреждение. Если вы не хотите, чтобы оно появилось, вам нужно переместить банку с сервлетами из вашего проекта, а не использовать банку из tomcat. Возьмите tomcat и поместите его в ваш проект, вам удалось убедить tomcat загрузить его из вашего веб-приложения, а не оттуда, откуда он его ожидал, что вызвало проблему с загрузчиком классов, как указано в ответе BalusC.

Редактирование: Вышеуказанное было отредактировано, чтобы прояснить, что происходило после того, как вы поместили банку с сервелетами из tomcat в ваше веб-приложение (и атрибут BalusC).

2
ответ дан 27 November 2019 в 23:33
поделиться

Это признак загрязнения клас-спата. Библиотеки JSP/Servlet API зависят от реализации сервера приложений и принадлежат в случае Tomcat 6 в папке Tomcat/lib и не должны в никак переноситься или дублироваться куда-либо еще. Это рецепт проблем с переносимостью и столкновений при загрузке классов, с которыми вы столкнулись сейчас. Библиотеки в webapp имеют приоритет при загрузке классов. Если там встречается servlet-api.jar, то он, в свою очередь, ищет там свои зависимости, но, видимо, они там отсутствовали.

Вы должны удалить любые библиотеки, специфичные для webapp'а, из веб-приложения Webapp/WEB-INF/lib. Вы должны только поместить туда специфические для Веб-приложений библиотеки. Библиотеки, специфичные для webapp, следует хранить в собственном клас-спате по умолчанию, которым в Вашем случае является Tomcat/lib. Держите его нетронутым. В большинстве случаев вы можете добавлять библиотеки, которыми хотите поделиться со всеми web-приложениями, а еще лучше настроить shared.loader в Tomcat/conf/catalina.properties для этого.

Также удалите любые библиотеки, специфичные для сервера приложений и webapp'а, из папок JDK/lib и JRE/lib, если таковые имеются. Я слишком часто видел, что некоторые стартеры перемещают/копируют библиотеки туда, потому что "в противном случае они не компилируются". Вы никогда не должны копировать туда библиотеки, не относящиеся к JRK/JRE. Это также является рецептом проблем с переносимостью. При компиляции классов с помощью javac, вы должны использовать аргумент -cp для указания зависимых библиотек.

Update: в случае IDE (вы, кажется, используете ее, так как говорите о "пути сборки"), вам нужно связать web-проект с сервером приложений. В Eclipse, например, у вас есть возможность сделать это во время создания Dynamic Web Project. Вам необходимо интегрировать серверный экземпляр в Eclipse до создания проекта. Это можно сделать с помощью представления Servers (если предположить, что вы используете Eclipse для разработчиков Java EE , в противном случае - обновление). Вы также можете изменить его после этого через запись Servers в свойствах проекта. Выберите тот, который вы хотите использовать в качестве "сервера по умолчанию", после чего его библиотеки автоматически будут включены в путь сборки проекта. Нет абсолютно никакой необходимости их копировать/перемещать в другое место. Смотрите также Как импортировать javax.servlet API в мой проект Eclipse?

40
ответ дан 27 November 2019 в 23:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: