банку не завантажується. Див. Сервлет 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, але це не вийшло. Дайте мені знати, що слід зробити в моєму випадку.


Зауважте, що така поведінка відповідає специфікації сервлетів. Повне розуміння корисно для розуміння більш складних проблем, з якими ви можете зіткнутися.
Thorbjørn Ravn Andersen

Відповіді:


113

Файл .jar API сервлетів не повинен вбудовуватися всередину webapp, оскільки, очевидно, контейнер вже має ці класи на своєму classpath: він реалізує інтерфейси, що містяться в цій jar.

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

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>

"Залежність повинна знаходитися в наданому обсязі, а не в області компіляції за замовчуванням у вашому Maven pom." Як я можу це зробити
dreambigcoder

Дивіться мою відредаговану відповідь. очистіть і складіть додаток за допомогою Maven і переконайтеся, що банку сервлетів відсутня у каталозі WEB-INF / lib у створеному веб-сайті.
JB Nizet

Я все зробив. але я знаходжу банку в каталозі WEB-INF / lib. Якщо я вийму банку, я отримую нижче повідомлення ІНФОРМАЦІЯ: Запуск сервлет-двигуна: Apache Tomcat / 7.0.12 Чи потрібно щось робити?
dreambigcoder

6
Можливо, у вас є залежність, яка має перехідну залежність до іншої версії банку з сервлетами. Використовуйте mvn залежність: tree, щоб знайти, звідки походить ця банка сервлетів, і додайте виключення.
JB Nizet

як мені зробити те ж саме для плюща?
Дінеш Бабу KG

21

Це попередження ви отримуєте, коли файл jar jarbol servlet вже завантажений у контейнер, і ви намагаєтесь ще раз завантажити його з libкаталогу.

Специфікації Servlet говорять, що у вашому веб- каталозі webapps заборонено мати файл servlet.jarlib .

  • Позбудьтеся попереджувального повідомлення, просто видаливши його 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, оскільки контейнер вже надав банку з сервлетами.


4

Щоб виправити це, встановіть область, що надається . Це говорить Maven використовувати код servlet-api.jar лише для компіляції та тестування, але НЕ включати його у файл WAR. Розгорнутий контейнер "надаватиме" сервлет-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

Обсяг залежності Мевена

за умови : Це дуже схоже на компіляцію, але вказує на те, що ви очікуєте, що JDK або контейнер забезпечать залежність під час виконання. Наприклад, створюючи веб-додаток для Java Enterprise Edition, ви встановите залежність від API сервлетів та відповідних API API EE Java в межах передбаченого обсягу, оскільки веб-контейнер забезпечує ці класи . Ця область доступна лише для компіляції та тестового класу, і не є перехідною.


1

Я боровся з цим питанням і перепробував численні "рішення".

Однак, врешті-решт, єдиний, хто працював, і це фактично зайняло кілька секунд, щоб це: видалити та додати новий екземпляр сервера !

В основному, я правою кнопкою миші натиснув на свій сервер Tomcat в Eclipse під сервером і видалив його. Далі я додав новий сервер Tomcat. Очистили та перерозподілили додаток, і я позбувся цієї помилки.


Клацніть правою кнопкою миші на вашому сервері -> Очистити ..., а потім знову клацніть правою кнопкою миші на вашому сервері -> чистий робочий каталог 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 ("/ вхід").


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>

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 залежність: дерево

і виявіть, що у вас є перехідна залежність від "чогось", що залежить від баночки, яка є або servlet-api, або чогось подібного (наприклад:) tomcat-servlet-api-9.0.0. Тож додайте до цього виключення до вашого пом, наприклад: (у моєму випадку, tomcat, у вашому випадку, ймовірно, ті, про які йдеться в інших відповідях):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.