Ich leite ein Maven-Projekt, das auch ein dynamisches Webprojekt ist. Ich habe alle Spring-Bibliotheken in Maven benutzt. Ich habe web.xml
Erstellt, aber wenn ich meinen Tomcat 7-Server starte, wird die 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 webapp/lib
Zu löschen, aber es hat nicht funktioniert. Lassen Sie mich wissen, was in meinem Fall zu tun ist.
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 sich im Bereich provided
und nicht im Standardbereich compile
in Ihrem Maven-Pom befinden:
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
Sie erhalten diese Warnmeldung, wenn die Servlet-API-JAR-Datei bereits in den Container geladen wurde und Sie versuchen, sie erneut aus dem Verzeichnis lib
zu laden.
Die Servlet-Spezifikationen besagen, dass Sie nicht servlet.jar in Ihrem Webapps-Verzeichnis
lib
haben dürfen.
servlet.jar
Aus Ihrem lib
-Verzeichnis entfernen.lib
finden, suchen Sie nach Ihrem Erstellungspfad und entfernen Sie die JAR-Datei.C:\Program Files\Apache Software Foundation\Tomcat 7.0\webapps\project\WEB-INF\lib
Wenn Sie ein Maven-Projekt ausführen, ändern Sie die Abhängigkeit javax.servlet-api
In scope provided
in Ihrer pom.xml, da der Container das Servlet-Jar bereits selbst bereitgestellt hat.
Um das Problem zu beheben, setzen Sie scope auf provided. 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 implementierte Container stellt zur Laufzeit die Datei servlet-api.jar zur Verfügung.
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
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 das Programm im lib-Ordner Ihrer bereitgestellten App aus und durchsuchen Sie die Datei index.txt nach der betreffenden Klasse.
for /r %X in (*.jar) do (echo %X & jar -tf %X) >> index.txt
vorausgesetzt : Dies ähnelt dem Kompilieren, zeigt jedoch an, dass Sie erwarten der [~ # ~] jdk [~ # ~] oder ein Container , um die Abhängigkeit zur Laufzeit bereitzustellen. Wenn Sie beispielsweise eine Webanwendung für die Java Enterprise Edition) erstellen, legen Sie die Abhängigkeit von der API Servlet fest und zugehörige Java EE-APIs zum Geltungsbereich bereitgestellt , weil Der Webcontainer stellt diese Klassen bereit. Dieser Bereich ist nur im Kompilierungs- und Testklassenpfad verfügbar und nicht transitiv.
Ich habe mit diesem Problem zu kämpfen und habe zahlreiche "Lösungen" ausprobiert.
Am Ende funktionierte jedoch nur Folgendes, und es dauerte tatsächlich einige Sekunden, bis dies erledigt war: 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 diesen gelöscht. Als nächstes habe ich einen neuen Tomcat-Server hinzugefügt. Bereinigte und stellte die Anwendung neu bereit und ich wurde diesen Fehler los.
Ausschlüsse und provided
Abhängigkeiten funktionieren in untergeordneten Projekten nicht.
Wenn Sie in Maven-Projekten die Vererbung verwenden, müssen Sie muss diese Konfiguration in die übergeordnete Datei pom.xml
Aufnehmen. Sie werden einen Abschnitt <parent>...</parent>
In Ihrer pom.xml haben wenn Sie Vererbung verwenden. Also haben Sie so etwas in Ihrem Elternteil 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>
Suchen Sie im folgenden Verzeichnis nach der JAR-Datei el-api.jar: C:\Apache-Tomcat-7.0.39\lib\el-api.jar, falls vorhanden, in diesem Verzeichnis Ihrer Webanwendung WEB-INF\lib\el-api.jar das glas sollte entfernt werden
Wenn Sie diese Meldung sehen, ist sie in der Regel 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 über eine integrierte Version dieses Jars verfügt, sodass es nicht Ihre Version verwenden wird. Normalerweise verursacht dies kein Problem.
Wenn es jedoch 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 transitiven Abhängigkeit von "etwas" haben, das von einem Glas abhängt, das entweder Servlet-API oder so ähnlich ist (Beispiel: Tomcat-servlet-api-9.0.0
). Fügen Sie Ihrem POM einen Ausschluss hinzu, z. B .: (in meinem Fall Tomcat, 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>
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").
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.