java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

85

Ich versuche, mit der Jersey + Google App Engine zwei Tage lang eine einfache Hallo-Welt-Anwendung zu erstellen. Für ein einfaches AppEngine-Projekt habe ich diese Tutorials befolgt und beide funktionieren einwandfrei https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Aber jetzt versuche ich, Jersey hinzuzufügen und folge diesem Tutorial http://www.vogella.com/articles/REST/article.html .

Aber der Server gibt mir immer wieder

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Wenn ich diese Zeilen in web.xml hinzufüge :

<?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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestServer</display-name>
<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>Jersey REST Service</servlet-name>
    <url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>

Ich habe Jersey JAX-RS 2.1 RI bundlevon hier heruntergeladen und alle JAR-Dateien im WEB-INF/libOrdner hinzugefügt, wie im Tutorial beschrieben. Und auch nach zwei Tagen funktioniert nichts. Ich habe mehrmals bei Google gesucht und anscheinend haben Leute, die Maven verwenden, es irgendwie gelöst, aber ich verwende Maven nicht und der Typ, der dieses Tutorial geschrieben hat, auch nicht.

Um zu überprüfen, ob es überhaupt com.sun.jersey.spi.container.servlet.ServletContainerimportierte Namen gibt, habe Jersey jarsich versucht, diesen vollständig qualifizierten Namen in Java zu schreiben und die Intellisense-Namen beenden zu lassen, aber ich konnte danach keine Intellisense mehr erhalten. com.sun.jeMeine letzte Vermutung ist, dass es im neuesten Jersey-Build einige Paketumstellungen gegeben hat und jerseyist nicht mehr drinnen com.sun. Ich bin erschöpft und würde mich über jede Hilfe freuen.

M-WaJeEh
quelle
Wie haben Sie das Jersey installiert? Ich kann auf nichts unter Version 2.29 zugreifen und Artikel spricht über 2.11?
Pixel

Antworten:

155

Sie haben Jersey 2 (welches RI von JAX-RS 2) heruntergeladen. Das Tutorial, auf das Sie sich beziehen, verwendet Jersey 1. Das Herunterladen von Jersey 1.17.1 von ( hier ) sollte für Sie ausreichen.

Jersey 1 verwendet com.sun.jersey, und Jersey 2 verwendet org.glassfish.jerseydaher die Ausnahme.

Beachten Sie auch, dass auch das init-paramBeginnen mit com.sun.jerseyvon Jersey 2 nicht erkannt wird.

Bearbeiten

Das Registrieren von Ressourcen und Anbietern in Jersey 2 enthält zusätzliche Informationen zum Registrieren von Klassen / Instanzen in Jersey 2.

Michal Gajdos
quelle
2
+1. Als Ergänzung für andere mit ähnlichen Problemen ist es hilfreich, das offizielle Jersey-Benutzerhandbuch zu lesen: Kapitel 4. Bereitstellen eines RESTful-Webdienstes
informatik01
5
Neue Klasse für Servlet-Container ist "org.glassfish.jersey.servlet.ServletContainer"
cljk
4
Servlet-Klasse: org.glassfish.jersey.servlet.ServletContainer, Init-Parameter-Name: jersey.config.server.provider.packages.
Picmate 11
1
Diese Antwort erklärt gut den Grund für das Problem / den Fehler, lässt aber die Lösung sehr offen. Denn mit den wenigen Informationen, die Sie gaben, konnte ich mein Problem nicht lösen. Einige weitere Details zu den Dateien pom.xml, web.xml und Java könnten einen besseren Job machen. Oder verweisen Sie auf einen Blog oder Artikel, der den Leser in ein Tutorial für Jersey 2.x
Paulo Oliveira
1
@Siddharth Der verlinkte Artikel sollte einige Ansätze zeigen, wie man das Problem löst. Wenn in diesem Artikel Informationen fehlen, lassen Sie es mich wissen. Oder Sie können Ihre Lösung jederzeit als Antwort auf diese Frage bereitstellen.
Michal Gajdos
33

Wenn Sie jersey 2.x verwenden, benötigen Sie eine andere Konfiguration in web.xml, da die Servlet-Klasse darin geändert wird. Sie können Ihre web.xml mit der folgenden Konfiguration aktualisieren.

    <servlet>
    <servlet-name>myrest</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>your.package.path</param-value>
    </init-param>
    <init-param>
     <param-name>unit:WidgetPU</param-name>
     <param-value>persistence/widget</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>myrest</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
S. 27
quelle
9
Benötigen Sie tatsächlich Einheit: WidgetPU ? Ich denke, die Antwort könnte vereinfacht werden, indem man sie entfernt.
Nikita Bosik
1
Dieser Parameter bezieht sich nicht auf die Jersey <init-param> <param-name> -Einheit: WidgetPU </ param-name> <param-value> Persistenz / Widget </ param-value> </ init-param>
vaquar khan
22

Fügen Sie dies in pom hinzu

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-server</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.17.1</version>
</dependency>
<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-servlet</artifactId>
    <version>1.17.1</version>
</dependency>
user1249655
quelle
2
Trikot-Kern ist eine Abhängigkeit von Trikot-Server und viele müssen nicht explizit hinzugefügt werden
Kalpesh Soni
OK, was uns passiert ist, ist, dass wir den Trikot-Server von 1.0.2 auf 1.11 gestoßen haben und die Klasse "ServletContainer" plötzlich AWOL ist. Sieht so aus, als ob es in dieser und zukünftigen Versionen in das Trikot-Servlet-Paket ref
verschoben wurde
14

Es handelt sich um ein Eclipse-Setup-Problem, nicht um ein Jersey-Problem.

Von diesem Thread ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Klicken Sie mit der rechten Maustaste auf die Eigenschaften Ihres Eclipse-Projekts -> Bereitstellungsassembly -> Hinzufügen -> Java-Erstellungspfadeinträge -> Gradle-Abhängigkeiten -> Fertig stellen.

Daher verwendete Eclipse die Gradle-Abhängigkeiten nicht, als Apache gestartet wurde.

Adi
quelle
1
Ich habe so viel Zeit für dieses Problem verbracht und meinen Tag gerettet!
Tushar Thakur
3

Versuche dies :

org.glassfish.jersey.servlet.ServletContainer

auf Servlet-Klasse

Pichitron
quelle
2

Ich hatte das gleiche Problem wie Sie, obwohl ich einem anderen Leitfaden gefolgt bin: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Der seltsame Teil ist, dass ich in diesem Handbuch, das ich verwendet habe, kein Problem mit der Kompatibilität zwischen Versionen (1.x gegen 2.x) haben sollte, da Sie gemäß dem Handbuch das Trikot 1.8.x auf pom.xmlund in dem verwenden web.xml, auf das Sie sich beziehen eine Klasse ( com.sun.jersey.spi.container.servlet.ServletContainer) wie zuvor von 1.x Version gesagt. Wie ich daraus schließen kann, sollte dies funktionieren.

Ich vermute, weil ich JDK 1.7 verwende, existiert diese Klasse nicht mehr.


Nachdem ich versucht habe, mit den Antworten vor meinen zu lösen, hat mir nicht geholfen, ich habe Änderungen am pom.xmlund am vorgenommenweb.xml Fehler vorgenommen, geändert in:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Was angeblich existieren soll!

Aufgrund dieses Fehlers habe ich eine "neue" Lösung gefunden: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Generieren Sie mit Maven (Archetypen) ein Trikotprojekt wie folgt:

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.0

Und es hat bei mir funktioniert! :) :)

Paulo Oliveira
quelle
2

Ich hatte auch ein ähnliches Problem. Das Problem wurde behoben, indem Sie das Schritt-Schritt-Tutorial über den folgenden Link durchgingen.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/

  • Das Wichtigste ist, dass die Trikotbibliotheken korrekt im Ordner TOMCAT WEB-INF / lib abgelegt werden. Dies erfolgt automatisch über die im obigen Link genannten Eclipse-Einstellungen. Es wird eine WAR-Datei mit den abhängigen JAR-Dateien erstellt. Andernfalls treten Probleme mit der ClassNotFound-Ausnahme auf.

apache-tomcat-7.0.56-windows-x64 \ apache -tomcat-7.0.56 \ webapps \ JerseyJSONExample \ WEB-INF \ lib

"23.11.2014 00:06 130.458 jersey-client-1.9.jar

23.11.2014 00:06 458.739 jersey-core-1.9.jar

23.11.2014 00:06 147.952 jersey-json-1.9.jar

23.11.2014 00:06 713.089 jersey-server-1.9.jar "4 Datei (en) 1.450.238 Byte

  • Im zweiten Lernprogramm wird erläutert, wie Sie einen Webservice erstellen, der JSON-Ausgaben erzeugt und verbraucht.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

Beide Links gaben ein gutes Bild davon, wie die Dinge funktionieren und sparen viel Zeit.

Yogishaj
quelle
1

Wir erhalten diesen Fehler aufgrund eines Problems mit dem Erstellungspfad. Sie sollten " Server Runtime " -Bibliotheken in Build Path hinzufügen .

"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"

Führen Sie die folgenden Schritte aus, um die Ausnahme "Klasse nicht gefunden" zu beheben.

Rechtsklick auf project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

Sachin GN
quelle
0

Ich bin heute auf denselben Fehler gestoßen, obwohl ich Jersey 1.x verwendet habe und die richtigen Gläser in meinem Klassenpfad hatte. Für diejenigen, die dem Vogella-Tutorial zum Brief folgen und die 1.x-Gläser verwenden möchten, müssen Sie die Trikotbibliotheken zum Ordner WEB-INF / lib hinzufügen. Dies wird das Problem sicherlich lösen.

Rickygrimes
quelle
Ich habe den gleichen Fehler (unter Verwendung der Version 1.18.1 von Jersey-Server, Jersey-Core, Jersey-Servlet), aber das explodierte Artefakt, das IntelliJ Idea erstellt, ist ein einzelner WEB-INF-Ordner mit dem Klassenordner und der Datei web.xml.Classes Ordner enthält nur die Hello.class
Skiabox
0

Sie müssen jersey-bundle-1.17.1.jarzur lib des Projekts hinzufügen

<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <!-- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> --> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <!-- <param-name>jersey.config.server.provider.packages</param-name> --> <param-value>package.package.test</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

Ahmad R. Nazemi
quelle
0

Sie müssen in Ihrer web.xml ersetzen:

<servlet>
    <servlet-name>Jersey REST Service</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>com.sun.jersey.config.property.packages</param-name>
        <param-value>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

dafür:

<servlet>
    <servlet-name>Jersey REST Service</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.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

Dies ist Jersey 2.x verwendet org.glassfish.jersey-Pakete anstelle von com.sun.jersey (das von Jersey 1.x verwendet wird) und daher die Ausnahme. Beachten Sie, dass auch init-param, das mit com.sun.jersey beginnt, von Jersey 2.x nicht erkannt wird, sobald Sie auf JAX-RS 2.0 und Jersey 2.x migrieren

Wenn Sie zu irgendeinem Zeitpunkt maven verwenden, lautet Ihre pom.xml wie folgt:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.X</version>
</dependency>

Ersetzen Sie 2.X durch Ihre gewünschte Version, z. B. 2.15

Juan David Grisales Garzon
quelle
0

Eine einfache Problemumgehung besteht darin, zu überprüfen, ob Abhängigkeiten oder Bibliotheken in der Bereitstellungsassembly von eclipse vorhanden sind. Wenn Sie Tomcat verwenden, hat der Server möglicherweise die von uns verwendeten Bibliotheken möglicherweise nicht identifiziert. In diesem Fall geben Sie dies explizit in der Bereitstellungsassembly an.

scheinen
quelle
0

Zurück zum ursprünglichen Problem - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Wie oben zu Recht erwähnt, wurde in der JAX 2.x-Version die ServletContainer-Klasse in das Paket org.glassfish.jersey.servlet.ServletContainer verschoben. Das dazugehörige Glas ist jersey-container-servlet-core.jar, das im Lieferumfang enthalten ist jaxrs-ri-2.2.1.zip enthalten ist

JAX RS kann ohne MVN ausgearbeitet werden, indem alle in der Zip-Datei jaxrs-ri-2.2.1.zip enthaltenen Jars manuell kopiert werden (ich habe diese Version verwendet, würde mit jeder 2.x-Version funktionieren) Ordner WEB-INF / lib kopiert werden. Durch das Kopieren von Bibliotheken in den richtigen Ordner werden sie zur Laufzeit verfügbar.

Dies ist erforderlich, wenn Sie Eclipse zum Erstellen und Bereitstellen Ihres Projekts verwenden.

Andy1625
quelle
0

In der Datei pom.xml müssen wir hinzufügen

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>
KARTHIKEYAN.A
quelle
0

Der gleiche Fehler und mehr als 2 Stunden Debuggen und Ausprobieren aller Optionen. Ich habe den Maven / POM nicht verwendet, daher konnte ich die von wenigen gegebene Lösung nicht nutzen.

Schließlich wurde Folgendes behoben: Hinzufügen der Jars direkt zum Ordner tomcat / lib (NICHT WEB-INF \ lib) und Neustart des Tomcat.

Velu
quelle
0

Wenn jemand versucht, eine Hallo-Welt-Anwendung mit Jersey zu erstellen, ist es meiner Meinung nach eine der einfachsten Möglichkeiten, der Jersey-Dokumentation zu folgen.

https://jersey.github.io/download.html

Wenn Sie maven bereits verwenden, dauert es nur wenige Minuten, bis das Ergebnis angezeigt wird.

Ich habe unten verwendet.

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26
Ranga
quelle
0

Es hängt im Wesentlichen davon ab, welche Version Trikot Sie verwenden. Wenn Sie Jersey Version 1.XX verwenden, müssen Sie hinzufügen

Jersey 1 verwendet " com.sun.jersey " und Jersey 2 verwendet org.glassfish . auf Servlet-Klassen-Tag. Beachten Sie außerdem, dass auch init-param, das mit com.sun.jersey beginnt, von Jersey 2 nicht erkannt wird.

Und fügen Sie die gesamte JAR-Datei in den Ordner WEB-INF lib ein

Arun
quelle