słoik nie został załadowany. Zobacz specyfikację serwletu 2.3, rozdział 9.7.2. Obrażająca klasa: javax / servlet / Servlet.class

100

Prowadzę projekt Maven, który jest również dynamicznym projektem internetowym. Użyłem wszystkich bibliotek Springa w Maven. Utworzyłem web.xml, ale po uruchomieniu serwera Tomcat 7 otrzymuję następujący komunikat:

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

Próbowałem usunąć serwlet z webapp/lib, ale to nie zadziałało. Daj mi znać, co należy zrobić w moim przypadku.

dreambigcoder
źródło
Zauważ, że to zachowanie jest zgodne ze specyfikacją serwletu. Pełne zrozumienie jest pomocne w zrozumieniu trudniejszych problemów, z którymi możesz się spotkać.
Thorbjørn Ravn Andersen

Odpowiedzi:

113

Plik .jar interfejsu API serwletu nie może być osadzony w aplikacji internetowej, ponieważ oczywiście kontener ma już te klasy w swojej ścieżce klas: implementuje interfejsy zawarte w tym pliku jar.

Zależność powinna znajdować się w providedzakresie, a nie w compilezakresie domyślnym , w pompie Mavena:

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>3.1.0</version>
    <scope>provided</scope>
</dependency>
JB Nizet
źródło
„Zależność powinna znajdować się w podanym zakresie, a nie w domyślnym zakresie kompilacji, w pompie Mavena”. Jak mogę to zrobić
dreambigcoder
Zobacz moją zredagowaną odpowiedź. wyczyść i skompiluj aplikację za pomocą Mavena i sprawdź, czy plik jar serwletu nie znajduje się w katalogu WEB-INF / lib w wygenerowanej aplikacji internetowej.
JB Nizet,
Zrobiłem wszystko. jeszcze znajduję jar w katalogu WEB-INF / lib. Jeśli wyjmę jar, otrzymuję poniższy komunikat INFO: Uruchamianie silnika serwletu: Apache Tomcat / 7.0.12 Czy jest coś, co muszę zrobić?
dreambigcoder,
6
Być może masz zależność, która ma przechodnią zależność do innej wersji jar serwletu. Użyj zależności mvn: tree, aby dowiedzieć się, skąd pochodzi ten słoik serwletu, i dodaj wykluczenie.
JB Nizet,
jak zrobić to samo z bluszczem?
Dinesh Babu KG
21

Ten komunikat ostrzegawczy pojawia się, gdy plik jar api apletu apletu został już załadowany do kontenera i próbujesz załadować go ponownie z libkatalogu.

Specyfikacje serwletu mówią, że nie możesz mieć pliku servlet.jar w swoim libkatalogu webapps .

  • Pozbądź się komunikatu ostrzegawczego, po prostu usuwając go servlet.jarz libkatalogu.
  • Jeśli nie znajdziesz pliku jar w libkatalogu, przeszukaj ścieżkę kompilacji i usuń plik jar.

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

Jeśli uruchamiasz projekt maven, zmień javax.servlet-apizależność na scope providedw tobie pom.xml, ponieważ kontener już dostarczył sam jar serwletu.

Szczęściarz
źródło
4

Aby to naprawić, ustaw zakres na podany . To mówi Mavenowi, że używa kodu servlet-api.jar tylko do kompilacji i testowania, ale NIE umieszcza go w pliku WAR. Wdrożony kontener „zapewni” plik servlet-api.jar w czasie wykonywania.

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    <scope>provided</scope>
</dependency>
Sandeep Kumar
źródło
2

Poniższy wiersz poleceń systemu Windows może być przydatny w śledzeniu szkodliwego pliku jar. tworzy indeks wszystkich plików klas we wszystkich plikach jar w folderze. Wykonaj z folderu lib wdrożonej aplikacji, a następnie przeszukaj plik index.txt pod kątem naruszającej klasy klasy.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
Chris Nava
źródło
2

Zakres zależności Mavena

pod warunkiem : jest to podobne do kompilacji, ale wskazuje, że oczekuje się, że pakiet JDK lub kontener zapewni zależność w czasie wykonywania. Na przykład podczas tworzenia aplikacji internetowej dla Java Enterprise Edition należy ustawić zależność od interfejsu API serwletu i powiązanych interfejsów API Java EE na podany zakres, ponieważ kontener sieciowy udostępnia te klasy . Ten zakres jest dostępny tylko w ścieżce klasy kompilacji i testowania i nie jest przechodni.

yuceel
źródło
1

Zmagałem się z tym problemem i próbowałem wielu „rozwiązań”.

Jednak ostatecznie jedynym, który zadziałał i zajęło to kilka sekund, było: usunięcie i dodanie nowej instancji serwera !

Zasadniczo kliknąłem prawym przyciskiem myszy serwer Tomcat w Eclipse w obszarze Serwery i usunąłem go. Następnie dodałem nowy serwer Tomcat. Wyczyściłem i ponownie wdrożyłem aplikację i pozbyłem się tego błędu.

iaforek
źródło
Kliknij prawym przyciskiem myszy na serwerze -> Clean ... a następnie ponownie kliknij prawym przyciskiem myszy na serwerze -> czysty katalog praca kocur stałe to dla mnie
kiltek
0

Sprawdź, czy w następującym katalogu znajduje się plik jar el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar, jeśli istnieje, to w tym katalogu Twojej aplikacji internetowej WEB-INF \ lib \ el-api.jar słoik należy wyjąć

Fred Ondieki
źródło
0

jeśli wzorzec adresu URL jest nieprawidłowy, może wystąpić ten błąd.

na przykład. Jeśli napisałeś @WebServlet ("login"), ten błąd zostanie wyświetlony. Poprawny to @WebServlet ("/ login").

Phyo Thinza
źródło
0

Wykluczenia i providedzależności nie będą działać w projektach podrzędnych.

Jeśli używasz dziedziczenia w projektach Maven, musisz dołączyć tę konfigurację do pom.xmlpliku nadrzędnego . Będziesz mieć <parent>...</parent>sekcję w swoim pom.xml, jeśli używasz dziedziczenia . Więc będziesz miał coś takiego w swoim rodzicu 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
źródło
0

Brak biblioteki zależności JAX-WS „jaxws-rt.jar”.

Przejdź tutaj http://jax-ws.java.net/ . Pobierz dystrybucję JAX-WS RI. Rozpakuj go i skopiuj „jaxws-rt.jar” do folderu biblioteki Tomcat „{$ TOMCAT} / lib”. Uruchom ponownie Tomcat.

Faiz
źródło
0

Zwykle, gdy widzisz ten komunikat, jest to niegroźne. Jeśli tak mówi

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

Oznacza to, że ignoruje twój servlet-api-2.5.jar, ponieważ tomcat ma już wbudowaną wersję tego jar, więc nie będzie używał twojego. Zwykle nie powoduje to problemu.

Jeśli jednak mówi WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

wtedy to, co możesz zrobić (w moim przypadku jest to zacieniony słoik) jest uruchamiane

Zależność $ mvn: drzewo

i odkryjesz, że masz przechodnią zależność od „czegoś”, co zależy od jar, którym jest aplet-api lub coś podobnego (np .:) tomcat-servlet-api-9.0.0. Więc dodaj do tego wykluczenie do swojego pom, np: (w moim przypadku kocur, w twoim przypadku prawdopodobnie te wymienione w innych odpowiedziach):

 <dependency>
    ...
    <exclusions>
      <exclusion>
        <groupId>org.apache.tomcat</groupId>
        <artifactId>tomcat-servlet</artifactId>
      </exclusion>
    </exclusions> 
</dependency>
rogerdpack
źródło
-4

Usuń servlet.jarz web-inf/libfolderu źródłowego, ponieważ jest dostępny w libfolderze tomcat, wtedy działa dobrze

Suresh Bkonda
źródło
1
Ta odpowiedź nie dodaje niczego, czego nie ma w tej odpowiedzi .
Glorfindel