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.

Dreambigcoder
quelle
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>
JB Nizet
quelle
"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.

Glücklich
quelle
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>
Sandeep Kumar
quelle
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
Chris Nava
quelle
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.

Yuceel
quelle
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.

iaforek
quelle
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

Fred Ondieki
quelle
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").

Phyo Thinza
quelle
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>
lmiguelmh
quelle
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.

Faiz
quelle
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>
Rogerdpack
quelle
-4

Entfernen Sie servlet.jarvon der Quelle web-inf/libOrdner wie es in tomcat verfügbar libOrdner dann es funktioniert gut

Suresh Bkonda
quelle
1
Diese Antwort fügt nichts hinzu, was nicht bereits in dieser Antwort enthalten ist .
Glorfindel