2013-03-24 2 views
93

Ich betreibe ein Maven-Projekt, das auch ein dynamisches Web-Projekt ist. Ich habe alle Frühlingsbibliotheken in Maven benutzt. Ich habe web.xml, aber wenn ich meinen Kater 7 Server starten ich folgende Meldung bin immer:Glas nicht geladen. Siehe Servlet Spec 2.3, Abschnitt 9.7.2. Beleidigende Klasse: javax/servlet/Servlet.class

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 von Webapp/lib zu löschen, aber es hat nicht funktioniert. Lassen Sie mich wissen, was in meinem Fall getan werden sollte.

+0

Beachten Sie, dass dieses Verhalten wird entsprechend der Servlet-Spezifikation. Ein umfassendes Verständnis ist hilfreich, um die komplizierteren Probleme zu verstehen. –

+1

mögliches Duplikat von [Fehler: Servlet-Jar nicht geladen ... Offendierende Klasse: javax/servlet/Servlet.class] (http://stackoverflow.com/questions/1993493/error-servlet-jar-not-loaded-offending- class-javax-servlet-servlet-class) – Raedwald

Antwort

105

Die JAR-Datei der Servlet-API darf nicht in die Webanwendung eingebettet werden, da der Container in seinem Klassenpfad offensichtlich bereits über diese Klassen verfügt: Er implementiert die in diesem Jar enthaltenen Schnittstellen.

Die Abhängigkeit im provided Umfang sein soll, anstatt der Standard compile Umfang, in Ihrem Maven pom:

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

"Die Abhängigkeit sollte im angegebenen Bereich und nicht im Standard-Kompilierbereich in Ihrem Maven-Pom liegen."Wie kann ich das tun? – dreambigcoder

+0

Sehen Sie meine bearbeitete Antwort. Bereinigen und erstellen Sie die App mit Maven, und überprüfen Sie, dass das Servlet Jar nicht in der generierten Webanwendung im Verzeichnis WEB-INF/lib ist. –

+0

Ich habe alles gemacht. Aber ich finde das jar im Verzeichnis WEB-INF/lib. Wenn ich das jar entferne, erhalte ich die Meldung INFO: Servlet Engine starten: Apache Tomcat/7.0.12 Gibt es etwas, was ich tun muss? – dreambigcoder

1

prüft Innerhalb des folgenden Verzeichnisses für die JAR-Datei el-api.jar: C: \ apache-tomcat-7.0.39 \ lib \ el-api.jar Wenn es dann in diesem Verzeichnis Ihrer Webanwendung WEB-INF \ lib \ el-api.jar existiert, sollte das jar entfernt werden

21

Sie erhalten diese Warnung Meldung, wenn die Servlet-API-Jar-Datei bereits in den Container geladen wurde und Sie versuchen, sie erneut aus dem Verzeichnis lib zu laden.

The Servlet specs say you are not allowed to have servlet.jar in your webapps lib directory.

  • Lassen Sie sich einfach von der Warnmeldung loszuwerden servlet.jar von Ihrem lib Verzeichnis zu entfernen.
  • Wenn Sie das Glas im Verzeichnis lib nicht finden, suchen Sie nach Ihrem Build-Pfad und entfernen Sie das Glas.

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

Wenn Sie ein Maven-Projekt ausgeführt wird, ändern Sie die javax.servlet-api Abhängigkeit Umfang provided in Sie pom.xml, da der Container bereits die Servlet-Glas an sich zur Verfügung gestellt.

+1

Ich habe dieses Glas dort nicht .. – aProgrammer

+0

@Amit überprüfen Sie Ihren Build path..remove die JAR-Datei, wenn dort gefunden .. – Lucky

+0

habe diese Ausnahme – aProgrammer

0

Wenn Ihr URL-Muster falsch ist, ist dieser Fehler möglicherweise aufgetreten.

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

2

Sie können die folgende Windows-Befehlszeile nützlich beim Aufspüren der problematischen JAR-Datei finden. Es erstellt einen Index aller Klassendateien in allen Gläsern des Ordners. Führen Sie den Befehl im lib-Ordner Ihrer implementierten Anwendung aus, und suchen Sie in der Datei index.txt nach der betreffenden Klasse.

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

Maven Dependency Scope

provided : This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive.

4

es zu beheben, stellen Sie den Umfang zu zur Verfügung gestellt. Dies weist Maven an, den Code servlet-api.jar nur zum Kompilieren und Testen zu verwenden, aber NICHT in die WAR-Datei aufzunehmen. Der bereitgestellte Container wird die Servlet-api.jar zur Laufzeit "bereitstellen".

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

Ich habe mit diesem Problem gekämpft und ich habe zahlreiche "Lösungen" ausprobiert.

Am Ende funktionierte das einzige, und es dauerte tatsächlich ein paar Sekunden, um es zu tun: löschen und hinzufügen neue Server Instanz!

Grundsätzlich habe ich rechts auf meinen Tomcat-Server in Eclipse unter Server geklickt und ihn gelöscht. Als nächstes habe ich einen neuen Tomcat-Server hinzugefügt. Die Anwendung wurde bereinigt und neu implementiert und ich habe diesen Fehler behoben.

+0

Rechtsklick auf Ihrem Server -> Reinigen ... und dann wieder rechts auf den Server klicken -> sauber Tomcat Arbeitsverzeichnis für mich behoben – kiltek

-4

entfernen servlet.jar von der Quelle web-inf/lib Ordner wie es in tomcat lib Ordner verfügbar ist, dann funktioniert es gut

+1

Diese Antwort tut füge nichts hinzu, das noch nicht in [dieser Antwort] ist (http://stackoverflow.com/a/16710657/4751173). – Glorfindel

0

Ausschlüsse und provided Abhängigkeiten werden in der Kinderprojekte nicht.

Wenn Sie die Vererbung in Maven Projekte verwenden Sie müssen umfassen diese Konfiguration auf der übergeordneten pom.xml Datei. Sie haben einen <parent>...</parent> Abschnitt in Ihrer pom.xml , wenn Sie die Vererbung verwenden. So werden Sie so etwas in Ihrer Eltern haben 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ängigkeit Bibliothek „jaxws-rt.jar“ fehlt.

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

0

Normalerweise, wenn Sie diese Nachricht sehen, ist es gutartig. Wenn sie sagt

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 

Es bedeutet, dass es Ihren Servlet-api-2.5.jar ignoriert, weil tomcat bereits eine integrierte Version dieses Glas hat, so wird es nicht von Ihnen verwendet werden. In der Regel verursacht dies kein Problem.

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

dann, was Sie tun können (in meinem Fall ist es eine schattige jar)

ausgeführt wird

$ mvn Abhängigkeit: Baum

und entdecken, dass Sie eine transitive haben Abhängigkeit von "etwas", das von einem Jar abhängt, das entweder Servlet-API oder etwas ähnliches ist (zB: tomcat-servlet-api-9.0.0). So fügen Sie einen Ausschluss zu, dass auf Ihre pom, ex: (in meinem Fall, tomcat, in Ihrem Fall wohl die in den anderen Antworten erwähnt sind):

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