Vielleicht haben Sie das Gefühl, dass dies eine doppelte Frage ist, aber keine der Fragen mit demselben Titel löst meine Probleme. Ich verwende Jersey 2.0 und erstelle einen RESTful-Webdienst in Eclipse. Ich verwende Tomcat 7.0 als Server. Ich habe folgenden web.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://Java.Sun.com/xml/ns/javaee" xsi:schemaLocation="http://Java.Sun.com/xml/ns/javaee http://Java.Sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>JAX-RS Servlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.shop.domain</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>JAX-RS Servlet</servlet-name>
<url-pattern>/jaxrs/*</url-pattern>
</servlet-mapping>
</web-app>
Ich habe eine einfache Klasse namens Hallo:
@Path("customers")
public class Hello {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String getCustomer() {
return "hello";
}
}
Ich habe eine Jersey-Bibliothek namens jersey
:
Jedes Mal, wenn ich dieses Projekt leitete, bekam ich einen Fehler
Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
Irgendwelche Ideen?
Warten Sie, Sie sagten, Sie hätten eine Jersey-Bibliothek namens jersey
. Haben Sie einen User Library
erstellt und ihn jersey
genannt? Versuchen Sie in diesem Fall, Ihre Jersey-JAR-Dateien in WebContent -> WEB-INF -> lib zu kopieren.
Ich denke, das wurde schon beantwortet, wollte aber nur einen zusätzlichen Tipp hinzufügen.
Für Webprojekte in Eclipse ist es fast immer ratsam, Abhängigkeiten mit Maven zu verwalten. Verwenden Sie ein Maven-Plugin wie m2e. Wenn Sie Ihrem Maven-Projekt eine Abhängigkeit hinzugefügt haben, sollten diese Bibliotheken automatisch in WEB-INF/lib bereitgestellt werden. Wenn dies nicht der Fall ist (aus welchen Gründen auch immer), können Sie dies ausdrücklich tun:
Dies sollte die Bibliotheken zu WEB-INF/lib hinzufügen, obwohl Sie sie immer noch nicht in der Projekt-Explorer-Ansicht sehen. Aber Ihre ClassNotFoundException sollte jetzt verschwinden.
Während alle oben genannten Bedingungen zutreffen können (Eclipse ist nicht die glaubwürdigste Anwendung), stellen Sie sicher, dass Sie Ihre Maven-Abhängigkeiten überprüft haben. Sie sollten beachten, dass ich für Jersey 2.19 diese beiden Abhängigkeiten hinzufügen musste:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.19</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.19</version>
</dependency>
Ich habe dieses Problem mit Eclipse. Mein Projekt, das einen sehr ähnlichen Aufbau hat - Jersey 2
, Tomcat 7
. Ich führe Tomcat in Eclipse aus, und es scheint, dass Eclipse irgendwann vergessen hat, wie man die Bibliotheken ordnungsgemäß in Tomcat bereitstellt.
Ich habe versucht, meine Kriegsdatei manuell auf Tomcat bereitzustellen und sie über startup.sh
Zu starten, und es hat funktioniert, aber wenn ich sie über Eclipse starte, erhalte ich meinen Webinhalt, aber die Jersey-Klassen sind nicht vorhanden, daher die REST API funktioniert nicht. Mein Login-Servlet funktioniert einwandfrei, nur nicht das Trikot-Bit. Die Konsole hat den gleichen Fehler:
Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
beim Start. Es muss also ein Problem damit geben, wie Eclipse Code für Tomcat bereitstellt. Ich habe versucht, auf Eclipse-Servern zuzugreifen und das Arbeitsverzeichnis zu löschen, habe aber nichts getan. (nicht, dass es für fehlende Klassen wäre).
Das einzige, was funktionierte, war, meine Serverkonfiguration in Eclipse aufzurufen und meinen Tomcat-Eintrag zu löschen und dann einen neuen zu erstellen. Ich habe das getan und es hat es sofort behoben.
Die Nachricht ist einfach genug, um die Ursache zu ermitteln, dass sich die Jersey-Bibliotheken nicht im Klassenpfad befinden.
Als Erstes sollten Sie überprüfen, ob das Wetter in pom.xml definiert ist oder nicht. Wenn nicht, dann sind die Abhängigkeiten, die Sie definieren können. xml, ignorieren Sie das Hinzufügen von Abhängigkeiten in Ihrer pom.xml.
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.19</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.19</version>
</dependency>
Lösung - Hinzufügen einer Jersey-Bibliothek in der Bereitstellungsassembly
1. Klicken Sie im Projekt-Explorer mit der rechten Maustaste auf Ihr Projekt.
2. Öffnen Sie die Konfiguration der Projektbereitstellung für die Projektbereitstellung.
3. Fügen Sie Build-Pfad-JAR-Dateien in Assembly hinzu, damit sie zum Ordner Lib in der final-war-Datei hinzugefügt werden können.
4. Die aktualisierte Baugruppe sieht folgendermaßen aus.
Klicken Sie auf OK . Nun können Sie loslegen.
Ich beobachte auch das gleiche Problem. Ich verwende Tomcat8 mit Maven. Wenn ich Dynamic Web Project erstelle und alle Bibliotheken manuell hinzufüge, funktioniert das Projekt gut, aber wenn ich Maven verwende, wird folgender Fehler angezeigt:
SEVERE: Servlet [Jersey REST Service] in web application [/EmployeeManagement] threw load() exception
Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.Java:1313)
at org.Apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.Java:1164)
at org.Apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.Java:520)
at org.Apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.Java:501)
at org.Apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.Java:120)
at org.Apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.Java:1095)
at org.Apache.catalina.core.StandardWrapper.load(StandardWrapper.Java:1031)
at org.Apache.catalina.core.StandardContext.loadOnStartup(StandardContext.Java:4914)
at org.Apache.catalina.core.StandardContext.startInternal(StandardContext.Java:5201)
at org.Apache.catalina.util.LifecycleBase.start(LifecycleBase.Java:150)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1408)
at org.Apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.Java:1398)
at Java.util.concurrent.FutureTask.run(FutureTask.Java:262)
at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1145)
at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:615)
at Java.lang.Thread.run(Thread.Java:744)
Ich habe folgende Maven-Abhängigkeiten in der Datei pom.xml hinzugefügt:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.21</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.21</version>
</dependency>
Fügen Sie dem Build-Pfad unter Library die Jersey-Bibliothek hinzu
Die jersey-jar-Dateien sollten in WEB-INF/lib eingefügt werden.
Wenn Sie Ihre Trikot-JAR-Dateien nicht in WEB-INF/lib ablegen können, versuchen Sie es manuell zu kopieren, indem Sie durch Ihren Arbeitsbereich gehen und Eclipse neu starten! Das hat bei mir funktioniert.
Ich möchte hinzufügen, ich hatte das gleiche Problem und die Antwort von @ Edin hat funktioniert, jedoch habe ich IntelliJ verwendet. Also dachte ich, ich würde einen Weg hinzufügen, um dies für Intellij (für zukünftige Leute wie mich) zu tun:
Für mich war das Problem:
Right click on Project -> Properties -> Java Build Path -> Libraries ->
Add Library... -> Server Runtime -> Apache Tomcat v7.0 -> Finish
Ein weiterer Schritt, den ich gemacht habe, war das Importieren von Material in Maven, aber es war nicht notwendig, da es auch ohne es gut läuft.
Aber hier ist es, wenn es jemandem hilft
<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.2.1-b03</version>
<scope>provided</scope>
</dependency>
servlet-Jars in WEB-INF/lib zu setzen, machte die Sache komplizierter, da die Exception Message komplizierter und irrelevanter wurde
BEARBEITEN: ach was hilft auch, ein Update-Projekt für Ihr Maven-Projekt durchzuführen.