Jar не загружен. См. Раздел Servlet Spec 2.3, раздел 9.7.2. Класс нарушения: javax/servlet/Servlet.class
Я запускаю проект Maven, который также является динамичным веб-проектом. Я использовал все библиотеки spring в maven. Я создал web.xml
, но когда я запускаю свой tomcat 7-сервер, я получаю следующее сообщение:
INFO: validateJarFile(C:\Users\mibvzd0\workspace\.metadata\.plugins\
org.eclipse.wst.server.core\tmp2\wtpwebapps\hapi_hl7\WEB-INF\lib\
servlet-api-2.4.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Я попытался удалить сервлет из webapp/lib, но это не сработало. Позвольте мне знать, что должно быть сделано в моем случае.
Ответы
Ответ 1
Файл .jar API сервлета не должен быть встроен в webapp, поскольку, очевидно, контейнер уже имеет эти классы в своем пути к классам: он реализует интерфейсы, содержащиеся в этой банке.
Зависимость должна находиться в области provided
, а не в области по умолчанию compile
, в вашем Maven pom:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Ответ 2
Вы получите это предупреждающее сообщение, когда файл api jar сервлета уже загружен в контейнер, и вы попытаетесь загрузить его еще раз из каталога lib
.
В спецификациях Servlet вам не разрешено иметь servlet.jar в ваш каталог webapps lib
.
- Избавьтесь от предупреждения, просто удалив
servlet.jar
из каталога lib
.
- Если вы не найдете банку в сканировании каталога
lib
для своего пути сборки и удалите банку.
C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib
Если вы выполняете проект maven, измените зависимость javax.servlet-api
на область provided
в pom.xml, поскольку контейнер уже предоставил сам ящик сервлета.
Ответ 3
Чтобы исправить это, установите область . Это говорит Maven использовать код servlet-api.jar только для компиляции и тестирования, но НЕ включать его в WAR файл. Развернутый контейнер будет "предоставлять" servlet-api.jar во время выполнения.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
Ответ 4
Вы можете найти следующую командную строку Windows, полезную для отслеживания файла-нарушителя. он создает индекс всех файлов классов во всех баночках в папке. Выполните из папки lib вашего развернутого приложения, затем выполните поиск в файле index.txt для класса-нарушителя.
for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
Ответ 5
Maven Dependency Scope
. Это очень похоже на компиляцию, но указывает, что ожидать JDK или контейнер для предоставления зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы будет устанавливать зависимость от API сервлета и связанных с ним API Java EE для области при условии, поскольку веб-контейнер предоставляет эти классы. Эта область видимости доступна только на пути компиляции и тестирования, и не является транзитивным.
Ответ 6
Проверьте в следующей директории файл jar el-api.jar: C:\apache-tomcat-7.0.39\lib\el-api.jar, если он существует, тогда в этом каталоге вашего веб-приложения WEB-INF\lib\el-api.jar следует удалить банку
Ответ 7
Я боролся с этой проблемой, и я пробовал множество "решений".
Однако, в конце концов, единственный, который работал, и это заняло всего несколько секунд, это: удалить и добавить новый экземпляр сервера!
В принципе, я щелкнул правой кнопкой мыши мой сервер Tomcat в Eclipse под серверами и удалил его. Затем я добавил новый сервер Tomcat. Убрал и переустановил приложение, и я избавился от этой ошибки.
Ответ 8
когда ваш шаблон URL неверен, эта ошибка может возникнуть.
например. Если вы написали @WebServlet ( "login" ), эта ошибка будет показана. Правильным является @WebServlet ( "/login" ).
Ответ 9
Исключения и provided
зависимости не будут работать в дочерних проектах.
Если вы используете наследование в проектах Maven, вы должны включить эту конфигурацию в родительский pom.xml
файл. У вас будет раздел <parent>...</parent>
в вашем pom.xml, если вы используете наследование. Таким образом, у вас будет что-то подобное в вашем родителе pom.xml
:
<groupId>some.groupId</groupId>
<version>1.0</version>
<artifactId>someArtifactId</artifactId>
<packaging>pom</packaging>
<modules>
<module>child-module-1</module>
<module>child-module-2</module>
</modules>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
Ответ 10
Библиотека зависимостей JAX-WS "jaxws-rt.jar" отсутствует.
Перейдите сюда http://jax-ws.java.net/.
Загрузите дистрибутив JAX-WS RI.
Разархивируйте его и скопируйте "jaxws-rt.jar" в папку библиотеки Tomcat "{$ TOMCAT}/lib".
Перезапустите Tomcat.
Ответ 11
Обычно, когда вы видите это сообщение, оно доброкачественное.
Если он говорит
INFO: validateJarFile(/<webapp>/WEB-INF/lib/servlet-api-2.5.jar) - jar not loaded.
See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
Это означает, что он игнорирует ваш servlet-api-2.5.jar, потому что tomcat уже имеет встроенную версию этой банки, поэтому он не будет использовать ваш. Обычно это не вызывает проблемы.
Если, однако, сказано WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class
то что вы можете сделать (в моем случае, это затененная банка) выполняется
$mvn dependency: tree
и обнаружите, что у вас есть транзитивная зависимость от "чего-то", которая зависит от банки, которая является либо servlet-api, либо чем-то вроде этого (ex: tomcat-servlet-api-9.0.0
). Поэтому добавьте исключение к этому вашему pom, например: (в моем случае, tomcat, в вашем случае, возможно, упомянутые в других ответах):
<dependency>
...
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet</artifactId>
</exclusion>
</exclusions>
</dependency>
Ответ 12
Удалите servlet.jar
из исходной папки web-inf/lib
, поскольку она доступна в папке tomcat lib
, тогда она отлично работает