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


86

Próbuję zbudować prostą aplikację Hello world na dwa dni, używając silnika aplikacji Jersey + Google. W przypadku prostego projektu AppEngine postępowałem zgodnie z tymi samouczkami i oba działają dobrze https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Ale teraz próbuję dodać Jersey i postępuję zgodnie z tym samouczkiem http://www.vogella.com/articles/REST/article.html .

Ale serwer ciągle mi daje

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

kiedy dodam te linie w 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" 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>

Pobrałem Jersey JAX-RS 2.1 RI bundleod tu i dodaniu wszystkich plików jar w WEB-INF/libfolderze w sposób opisany w tutorialu. I nawet po dwóch dniach nic nie działa. Szukałem kilka razy w Google i najwyraźniej ludzie, którzy używają Mavena, jakoś to rozwiązali, ale ja nie używam Mavena, podobnie jak facet, który napisał ten samouczek.

Żeby sprawdzić, czy w ogóle com.sun.jersey.spi.container.servlet.ServletContaineristnieje w importowanym Jersey jars, próbowałem po prostu napisać tę w pełni kwalifikowaną nazwę w Javie i pozwolić funkcji Intellisense na dokończenie nazw, ale nie mogłem uzyskać żadnego Intellisense po tym, com.sun.jewięc moje ostatnie przypuszczenie jest takie, że w najnowszej kompilacji Jersey nastąpiła pewna zmiana kolejności pakietów i jerseynie ma już w środku com.sun. Jestem wyczerpany i byłbym wdzięczny za każdą pomoc.


Jak zainstalowałeś Jersey? Nie mogę uzyskać dostępu do niczego poniżej wersji 2.29, a artykuł mówi o 2.11?
piksel

Odpowiedzi:


155

Pobrałeś Jersey 2 (czyli RI z JAX-RS 2). Samouczek, do którego się odnosisz, wykorzystuje Jersey 1. Pobierz Jersey 1.17.1 ( tutaj ), powinien wystarczyć.

Jersey 1 używa com.sun.jersey, a Jersey 2 używa, org.glassfish.jerseystąd wyjątek.

Pamiętaj również, że również init-paramzaczynające się od com.sun.jerseynie zostaną rozpoznane przez Jersey 2.

Edytować

Rejestracja zasobów i dostawców na Jersey 2 zawiera dodatkowe informacje na temat rejestrowania klas / instancji na Jersey 2.


2
+1. Jako dodatek dla innych z podobnymi problemami, przydatne będzie przeczytanie oficjalnego Podręcznika użytkownika Jersey: Rozdział 4. Wdrażanie usługi sieciowej RESTful
informatik01

6
nową klasą kontenera serwletów jest „org.glassfish.jersey.servlet.ServletContainer”
cljk

4
klasa-serwletu: org.glassfish.jersey.servlet.ServletContainer, nazwa-parametru-init: jersey.config.server.provider.packages.
picmate 涅

1
Ta odpowiedź dobrze wyjaśnia przyczynę problemu / błędu, ale pozostawia rozwiązanie bardzo otwarte. Ponieważ przy tych niewielkich informacjach nie mogłem rozwiązać problemu. Więcej szczegółów na temat plików pom.xml, web.xml i java może przynieść lepsze rezultaty. Lub skieruj bloga lub artykuł, który prowadzi czytelnika do samouczka na temat Jersey 2.x
Paulo Oliveira

1
@Siddharth, powiązany artykuł miał pokazać kilka podejść do rozwiązania problemu. Jeśli w tym artykule brakuje niektórych informacji, daj mi znać. Lub zawsze możesz podać swoje rozwiązanie jako odpowiedź na to pytanie.
Michał Gajdos

34

Jeśli używasz jersey 2.x, potrzebujesz innej konfiguracji w pliku web.xml, ponieważ klasa serwletu jest w nim zmieniana. możesz zaktualizować swój web.xml z następującą konfiguracją.

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

9
Czy faktycznie potrzebujesz jednostki: WidgetPU ? Myślę, że odpowiedź można by uprościć, usuwając ją.
Nikita Bosik

1
Ten parametr nie jest powiązany z jednostką Jersey <init-param> <param-name>: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan

22

Dodaj to w pom

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

2
jersey-core jest zależnością serwera jersey-server i wielu nie trzeba dodawać wprost
Kalpesh Soni

OK, co nam się przydarzyło to to, że wpadliśmy na serwer jersey-server z 1.0.2 na 1.11 i klasa "ServletContainer" nagle straciła ważność. Wygląda na to, że został przeniesiony w tej i przyszłych wersjach do pakietu jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

To problem z ustawieniem zaćmienia, a nie z Jersey.

Z tego wątku ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Kliknij prawym przyciskiem myszy projekt zaćmienia Właściwości -> Zespół wdrażania -> Dodaj -> Wpisy ścieżki budowania Java -> Zależności Gradle -> Zakończ.

Więc Eclipse nie używał zależności Gradle podczas uruchamiania Apache.


1
Spędziłem tak dużo czasu na ten problem, uratowałem mój dzień!
Tushar Thakur

3

Spróbuj tego :

org.glassfish.jersey.servlet.ServletContainer

w klasie serwletu


2

Miałem ten sam problem, co Ty, chociaż korzystałem z innego przewodnika: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Dziwne jest to, że w tym poradniku, z którego korzystałem, nie powinienem mieć problemu z kompatybilnością między wersjami (1.x z 2.x), ponieważ postępując zgodnie z instrukcją używasz koszulki 1.8.x na pom.xmli we wskazanej przez web.xmlCiebie wersji klasa ( com.sun.jersey.spi.container.servlet.ServletContainer) jak wspomniano wcześniej w wersji 1.x. Więc jak mogę wywnioskować, to powinno działać.

Domyślam się, że ponieważ używam JDK 1.7, ta klasa już nie istnieje.


Potem próbowałem rozwiązać z odpowiedziami przed moimi, nie pomogło, dokonałem zmian na pom.xmli na web.xmlbłędzie zmieniono na:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Który podobno powinien istnieć!

W wyniku tego błędu znalazłem „nowe” rozwiązanie: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Z Maven (archetypami), wygeneruj projekt koszulki, lubi to:

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

I zadziałało na mnie! :)


2

Ja też miałem podobny problem. Rozwiązano problem, przechodząc przez samouczek krok po kroku z poniższego łącza.

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

  • Najważniejszą rzeczą, na którą należy zwrócić uwagę, jest to, że biblioteki koszulek powinny być poprawnie umieszczone w folderze TOMCAT WEB-INF / lib. Odbywa się to automatycznie przez ustawienia Eclipse wymienione w powyższym linku. Utworzy plik WAR z zależnymi plikami JAR. W przeciwnym razie napotkasz problemy z wyjątkiem ClassNotFound.

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

„23.11.2014 12:06 AM 130.458 jersey-client-1.9.jar

23.11.2014 12:06 458,739 jersey-core-1.9.jar

23.11.2014 12:06 147,952 jersey-json-1.9.jar

23.11.2014 12:06 713 089 jersey-server-1.9.jar "4 Plik (i) 1450 238 bajtów

  • W drugim samouczku wyjaśniono, jak utworzyć usługę sieci Web, która generuje i zużywa dane wyjściowe JSON.

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

Oba linki dają dobry obraz tego, jak działają rzeczy, i pozwalają zaoszczędzić dużo czasu.


1

Otrzymujemy ten błąd z powodu problemu ze ścieżką kompilacji. W ścieżce kompilacji należy dodać biblioteki „ Server Runtime ”.

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

Wykonaj poniższe kroki, aby rozwiązać wyjątek „Nie znaleziono klasy”.

Kliknij prawym przyciskiem myszy project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

Dzisiaj napotkałem ten sam błąd, chociaż korzystałem z Jersey 1.x i miałem odpowiednie słoiki w mojej ścieżce klas. Dla tych, którzy chcieliby podążać za samouczkiem vogella co do litery i używać jars 1.x, musieliby dodać biblioteki koszulek do folderu WEB-INF / lib. To z pewnością rozwiąże problem.


Mam ten sam błąd (używam wersji jersey-server, jersey-core, jersey-servlet) w wersji 1.18.1, ale rozstrzelony artefakt, który tworzy IntelliJ Idea, to pojedynczy folder WEB-INF z folderem klas wewnątrz i plikiem web.xml. folder zawiera tylko Hello.class
skiabox.

0

musisz dodać jersey-bundle-1.17.1.jardo biblioteki projektu

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


0

Musisz zamienić w swoim web.xml:

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

dla tego:

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

to Jersey 2.x używa pakietów org.glassfish.jersey zamiast com.sun.jersey (który jest używany przez Jersey 1.x) i stąd wyjątek. Zwróć uwagę, że również init-param zaczynający się od com.sun.jersey nie zostanie rozpoznany przez Jersey 2.x po migracji na JAX-RS 2.0 i Jersey 2.x

jeśli w dowolnym momencie użyjesz maven, Twój pom.xml będzie wyglądał tak:

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

zamień 2.X na żądaną wersję, np. 2.15


0

Prostym obejściem jest sprawdzenie, czy masz zależności lub biblioteki w zestawie wdrożeniowym eclipse. Prawdopodobnie jeśli używasz tomcat, serwer mógł nie zidentyfikować bibliotek, których używamy. w takim przypadku określ to jawnie w zestawie wdrożeniowym.


0

Wracając do pierwotnego problemu - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Jak słusznie powiedziano powyżej, w wersji JAX 2.x klasa ServletContainer została przeniesiona do pakietu - org.glassfish.jersey.servlet.ServletContainer. Powiązany plik jar to jersey-container-servlet-core.jar, który znajduje się w pakiecie jaxrs-ri-2.2.1.zip

JAX RS można opracować bez mvn, ręcznie kopiując wszystkie pliki jar zawarte w pliku zip jaxrs-ri-2.2.1.zip (użyłem tej wersji, działałoby z każdą wersją 2.x) do folderu WEB-INF / lib. Skopiowanie bibliotek do odpowiedniego folderu udostępnia je w czasie wykonywania.

Jest to wymagane, jeśli używasz eclipse do tworzenia i wdrażania projektu.


0

W pliku pom.xml musimy dodać

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>

0

Ten sam błąd i zmarnowane ponad 2 godziny na debugowanie i wypróbowywanie wszystkich opcji. Nie korzystałem z Maven / POM, więc nie mogłem wykorzystać tego rozwiązania, które dało mi niewielu.

W końcu rozwiązało to: Dodanie plików jar bezpośrednio do folderu tomcat / lib (NOT WEB-INF \ lib) i ponowne uruchomienie tomcat.


0

Jeśli ktoś próbuje zbudować aplikację Hello world na Jersey, myślę, że jednym z najłatwiejszych sposobów jest postępowanie zgodnie z dokumentacją Jersey.

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

Jeśli już używasz Mavena, zobaczenie wyniku zajmie tylko kilka minut.

Użyłem poniżej.

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

0

Zasadniczo zależy to od używanej wersji koszulki. Jeśli używasz Jersey w wersji 1.XX, musisz dodać

Jersey 1 używa „ com.sun.jersey ”, a Jersey 2 używa org.glassfish . na tagu klasy serwletu. Zwróć też uwagę, że również parametr init zaczynający się od com.sun.jersey nie zostanie rozpoznany przez Jersey 2.

I dodaj cały plik jar do folderu WEB-INF lib

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.