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 bundle
od tu i dodaniu wszystkich plików jar w WEB-INF/lib
folderze 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.ServletContainer
istnieje 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.je
więc moje ostatnie przypuszczenie jest takie, że w najnowszej kompilacji Jersey nastąpiła pewna zmiana kolejności pakietów i jersey
nie ma już w środku com.sun
. Jestem wyczerpany i byłbym wdzięczny za każdą pomoc.
źródło
Odpowiedzi:
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.jersey
stąd wyjątek.Pamiętaj również, że również
init-param
zaczynające się odcom.sun.jersey
nie 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.
źródło
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ą.
źródło
Dodaj to w pom
źródło
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.
źródło
Spróbuj tego :
w klasie serwletu
źródło
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.xml
i we wskazanej przezweb.xml
Ciebie 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.xml
i naweb.xml
błę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:
I zadziałało na mnie! :)
źródło
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/
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
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.
źródło
Otrzymujemy ten błąd z powodu problemu ze ścieżką kompilacji. W ścieżce kompilacji należy dodać biblioteki „ Server Runtime ”.
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
źródło
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.
źródło
musisz dodać
jersey-bundle-1.17.1.jar
do 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>
źródło
Musisz zamienić w swoim web.xml:
dla tego:
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:
zamień 2.X na żądaną wersję, np. 2.15
źródło
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.
źródło
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.
źródło
W pliku pom.xml musimy dodać
źródło
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.
źródło
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.
źródło
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
źródło