банка не загружена. См. Servlet Spec 2.3, раздел 9.7.2. Класс нарушения: javax / servlet / Servlet.class

100

Я запускаю проект 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, но это не сработало. Сообщите мне, что делать в моем случае.

Dreambigcoder
источник
Обратите внимание, что это поведение соответствует спецификации сервлета. Полное понимание помогает понять более сложные проблемы, с которыми вы можете столкнуться.
Торбьорн Равн Андерсен

Ответы:

113

Файл .jar API сервлета не должен быть встроен в веб-приложение, поскольку, очевидно, контейнер уже имеет эти классы в своем пути к классам: он реализует интерфейсы, содержащиеся в этом jar-файле.

Зависимость должна быть в области providedвидимости, а не в области по умолчанию compileв вашем Maven pom:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
JB Nizet
источник
«Зависимость должна быть в предоставленной области, а не в области компиляции по умолчанию в вашем Maven pom». Как я могу это сделать
dreambigcoder
См. Мой отредактированный ответ. очистите и создайте приложение с помощью Maven и убедитесь, что jar сервлета не находится в каталоге WEB-INF / lib в сгенерированном веб-приложении.
JB Nizet
Я все сделала. но я нахожу банку в каталоге WEB-INF / lib. Если я удалю банку, я получаю сообщение ниже ИНФОРМАЦИЯ: Запуск механизма сервлетов: Apache Tomcat / 7.0.12 Что мне нужно сделать?
dreambigcoder
6
Возможно, у вас есть зависимость, которая имеет транзитивную зависимость от другой версии jar сервлета. Используйте mvn dependency: tree, чтобы узнать, откуда берется эта jar сервлета, и добавьте исключение.
JB Nizet
как мне сделать то же самое с плющом?
Динеш Бабу К.Г.
21

Вы получаете это предупреждающее сообщение, когда файл jar сервлета api уже загружен в контейнер и вы пытаетесь загрузить его еще раз из libкаталога.

Спецификации сервлетов говорят, что вам не разрешено иметь servlet.jar в вашем каталоге веб-приложений lib.

  • Избавьтесь от предупреждающего сообщения, просто удалив его servlet.jarиз своего libкаталога.
  • Если вы не нашли jar в libкаталоге, просканируйте путь сборки и удалите jar.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib

Если вы запускаете проект maven, измените javax.servlet-apiзависимость от области видимости providedв pom.xml, поскольку контейнер уже предоставил банку сервлета сам по себе.

Счастливый
источник
4

Чтобы исправить это, установите масштаб , чтобы при условии . Это говорит 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>
Сандип Кумар
источник
2

Следующая командная строка Windows может оказаться полезной при отслеживании вредоносного файла jar. он создает индекс всех файлов классов во всех банках в папке. Выполните из папки lib развернутого приложения, а затем найдите в файле index.txt класс-нарушитель.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
Крис Нава
источник
2

Область зависимости Maven

при условии : это очень похоже на компиляцию, но указывает на то, что вы ожидаете, что JDK или контейнер предоставят зависимость во время выполнения. Например, при создании веб-приложения для Java Enterprise Edition вы должны установить зависимость от Servlet API и связанных API Java EE для предоставленной области, поскольку веб-контейнер предоставляет эти классы . Эта область доступна только в пути к классам компиляции и тестирования и не является транзитивной.

Юсил
источник
1

Я боролся с этой проблемой и пробовал множество «решений».

Однако, в конце концов, единственное, что сработало, и на это потребовалось несколько секунд, было: удалить и снова добавить новый экземпляр сервера !

По сути, я щелкнул правой кнопкой мыши на моем сервере Tomcat в Eclipse в разделе «Серверы» и удалил его. Затем я добавил новый сервер Tomcat. Почистил и повторно развернул приложение и избавился от этой ошибки.

iaforek
источник
Щелкните правой кнопкой мыши на вашем сервере -> Очистить ... и затем снова щелкните правой кнопкой мыши на вашем сервере -> рабочий каталог clean tomcat исправил это для меня
kiltek
0

Проверьте внутри следующего каталога файл jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar, если он существует, то в этом каталоге вашего веб-приложения WEB-INF \ lib \ el-api.jar банку нужно удалить

Фред Ондиэки
источник
0

эта ошибка может возникнуть, если ваш шаблон URL неверен.

например. Если вы написали @WebServlet («логин»), эта ошибка будет показана. Правильный - @WebServlet ("/ login").

Phyo Thinza
источник
0

Исключения и 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>
lmiguelmh
источник
0

Библиотека зависимостей JAX-WS «jaxws-rt.jar» отсутствует.

Перейдите сюда http://jax-ws.java.net/ . Загрузите дистрибутив JAX-WS RI. Разархивируйте его и скопируйте «jaxws-rt.jar» в папку библиотеки Tomcat «{$ TOMCAT} / lib«. Перезапустите Tomcat.

Файз
источник
0

Обычно, когда вы видите это сообщение, это неопасно. Если это говорит

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 уже имеет встроенную версию этого jar-файла, поэтому он не будет использовать вашу. Обычно это не вызывает проблем.

Если, однако, говорится WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

то то, что вы можете сделать (в моем случае это закрашенная банка), выполняется

Зависимость $ mvn: дерево

и обнаружите, что у вас есть транзитивная зависимость от "чего-то", что зависит от jar-файла, который является либо servlet-api, либо чем-то подобным (например:) tomcat-servlet-api-9.0.0. Поэтому добавьте исключение к этому в свой pom, например: (в моем случае, tomcat, в вашем случае, вероятно, те, которые упомянуты в других ответах):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>
Роджердпак
источник
-4

Удалить servlet.jarиз исходной web-inf/libпапки, так как она доступна в libпапке tomcat, тогда она отлично работает

Суреш Бконда
источник
1
Этот ответ не добавляет ничего, чего еще не было в этом ответе .
Глорфиндель