Glas nicht geladen. Siehe Servlet-Spezifikation 2.3, Abschnitt 9.7.2. Beleidigende Klasse: javax / servlet / Servlet.class


100

Ich leite ein Maven-Projekt, das auch ein dynamisches Webprojekt ist. Ich habe alle Spring-Bibliotheken in Maven verwendet. Ich habe erstellt web.xml, aber wenn ich meinen Tomcat 7-Server starte, wird folgende Meldung angezeigt:

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

Ich habe versucht, das Servlet aus zu löschen webapp/lib, aber es hat nicht funktioniert. Lassen Sie mich wissen, was in meinem Fall zu tun ist.


Beachten Sie, dass dieses Verhalten der Servlet-Spezifikation entspricht. Ein umfassendes Verständnis ist hilfreich, um die schwierigeren Probleme zu verstehen, auf die Sie möglicherweise stoßen.
— Thorbjørn Ravn Andersen

Antworten:


113

Die .jar-Datei der Servlet-API darf nicht in die Webanwendung eingebettet werden, da der Container diese Klassen offensichtlich bereits in seinem Klassenpfad hat: Er implementiert die in dieser JAR enthaltenen Schnittstellen.

Die Abhängigkeit sollte in Ihrem Maven-POM im providedBereich und nicht im Standardbereich liegen compile:

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

"Die Abhängigkeit sollte in Ihrem Maven-POM im bereitgestellten Bereich und nicht im Standardkompilierungsbereich liegen." Wie kann ich das machen
— Dreambigcoder

Siehe meine bearbeitete Antwort. Bereinigen und erstellen Sie die App mit Maven und stellen Sie sicher, dass sich das Servlet-Jar nicht im Verzeichnis WEB-INF / lib in der generierten Webanwendung befindet.
— JB Nizet

Ich habe alles gemacht. Dennoch finde ich das Glas im Verzeichnis WEB-INF / lib. Wenn ich das Glas entferne, wird die folgende Meldung angezeigt: INFO: Servlet Engine starten: Apache Tomcat / 7.0.12 Muss ich etwas tun?
— Dreambigcoder

6
Möglicherweise haben Sie eine Abhängigkeit, die eine transitive Abhängigkeit zu einer anderen Servlet-JAR-Version aufweist. Verwenden Sie mvn dependency: tree, um herauszufinden, woher dieses Servlet-Jar stammt, und fügen Sie einen Ausschluss hinzu.
— JB Nizet

Wie mache ich dasselbe für Efeu?
— Dinesh Babu KG

21

Sie erhalten diese Warnmeldung, wenn die Servlet-API-JAR-Datei bereits in den Container geladen wurde und Sie versuchen, sie erneut aus dem libVerzeichnis zu laden .

Die Servlet-Spezifikationen besagen, dass Sie servlet.jar nicht in Ihrem Webanwendungsverzeichnis haben dürfenlib .

  • Entfernen servlet.jarSie die Warnmeldung, indem Sie sie einfach aus Ihrem libVerzeichnis entfernen .
  • Wenn Sie das JAR im libVerzeichnis nicht finden, suchen Sie nach Ihrem Erstellungspfad und entfernen Sie das JAR.

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

Wenn Sie ein Maven-Projekt ausführen, ändern Sie die javax.servlet-apiAbhängigkeit in den Bereich providedin Ihrer pom.xml, da der Container das Servlet-JAR bereits selbst bereitgestellt hat.


4

Um dies zu beheben, setzen Sie den Bereich auf " Bereitgestellt" . Dies weist Maven an, den Code servlet-api.jar nur zum Kompilieren und Testen zu verwenden, ihn jedoch NICHT in die WAR-Datei aufzunehmen. Der bereitgestellte Container stellt zur Laufzeit die Datei servlet-api.jar bereit.

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

2

Die folgende Windows-Befehlszeile ist möglicherweise hilfreich, um die fehlerhafte JAR-Datei aufzuspüren. Es wird ein Index aller Klassendateien in allen Gläsern im Ordner erstellt. Führen Sie die Ausführung im lib-Ordner Ihrer bereitgestellten App aus und durchsuchen Sie die Datei index.txt nach der fehlerhaften Klasse.

for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt

2

Maven-Abhängigkeitsbereich

vorausgesetzt : Dies ähnelt dem Kompilieren, zeigt jedoch an, dass Sie erwarten , dass das JDK oder ein Container die Abhängigkeit zur Laufzeit bereitstellt. Wenn Sie beispielsweise eine Webanwendung für die Java Enterprise Edition erstellen, legen Sie die Abhängigkeit von der Servlet- API und den zugehörigen Java EE-APIs auf den bereitgestellten Bereich fest, da der Webcontainer diese Klassen bereitstellt . Dieser Bereich ist nur im Kompilierungs- und Testklassenpfad verfügbar und nicht transitiv.


1

Ich habe mit diesem Problem zu kämpfen und zahlreiche "Lösungen" ausprobiert.

Am Ende funktionierte jedoch nur Folgendes, und es dauerte tatsächlich einige Sekunden, um Folgendes zu tun: Löschen und Hinzufügen einer neuen Serverinstanz !

Grundsätzlich habe ich in Eclipse unter Server mit der rechten Maustaste auf meinen Tomcat-Server geklickt und ihn gelöscht. Als nächstes habe ich einen neuen Tomcat-Server hinzugefügt. Die Anwendung wurde bereinigt und erneut bereitgestellt, und ich habe diesen Fehler behoben.


Klicken Sie mit der rechten Maustaste auf Ihren Server -> Bereinigen ... und dann erneut mit der rechten Maustaste auf Ihren Server -> Bereinigen Sie das Tomcat-Arbeitsverzeichnis und
— beheben Sie

0

Überprüfen Sie im folgenden Verzeichnis die JAR-Datei el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar, ob sie in diesem Verzeichnis Ihrer Webanwendung WEB-INF \ lib \ vorhanden ist el-api.jar das Glas sollte entfernt werden


0

Wenn Ihr URL-Muster falsch ist, kann dieser Fehler auftreten.

z.B. Wenn Sie @WebServlet ("login") geschrieben haben, wird dieser Fehler angezeigt. Das richtige ist @WebServlet ("/ login").


0

Ausschlüsse und provided Abhängigkeiten funktionieren in untergeordneten Projekten nicht.

Wenn Sie die Vererbung in Maven-Projekten verwenden, müssen Sie diese Konfiguration in die übergeordnete pom.xmlDatei aufnehmen. Sie haben einen <parent>...</parent>Abschnitt in Ihrer pom.xml, wenn Sie die Vererbung verwenden . Sie haben also so etwas bei Ihren Eltern 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

Die JAX-WS-Abhängigkeitsbibliothek "jaxws-rt.jar" fehlt.

Gehen Sie hier http://jax-ws.java.net/ . Laden Sie die JAX-WS RI-Distribution herunter. Entpacken Sie es und kopieren Sie "jaxws-rt.jar" in den Tomcat-Bibliotheksordner "{$ TOMCAT} / lib". Starten Sie Tomcat neu.


0

Wenn Sie diese Nachricht sehen, ist sie normalerweise harmlos. Wenn es heißt

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

Dies bedeutet, dass Ihr Servlet-api-2.5.jar ignoriert wird, da Tomcat bereits eine integrierte Version dieses JARs hat, sodass es Ihre nicht verwenden wird. In der Regel verursacht dies kein Problem.

Wenn es aber heißt WEB-INF/lib/my_jar.jar - jar not loaded...Offending class: javax/servlet/Servlet.class

Dann wird ausgeführt, was Sie tun können (in meinem Fall handelt es sich um ein schattiertes Glas)

$ mvn Abhängigkeit: Baum

und entdecken Sie, dass Sie eine transitive Abhängigkeit von "etwas" haben, das von einem Glas abhängt, das entweder Servlet-API oder ähnliches ist (z tomcat-servlet-api-9.0.0. B. :) . Fügen Sie Ihrem Pom einen Ausschluss hinzu, z. B.: (In meinem Fall Kater, in Ihrem Fall wahrscheinlich die in den anderen Antworten genannten):

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.