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


86

Я намагаюся створити простий додаток hello world протягом двох днів, використовуючи механізм додатків Jersey + Google. Для простого проекту AppEngine я дотримувався цих посібників, і обидва вони чудово працюють https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Але зараз я намагаюся додати Джерсі та слідуючи цьому посібнику http://www.vogella.com/articles/REST/article.html .

Але сервер продовжує давати мені

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

коли я додаю ці рядки в 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>

Я скачав Джерсі JAX-RS 2.1 RI bundleвід сюди і додали всі файли фляги в WEB-INF/libпапку , як описано в керівництві. І навіть через два дні нічого не працює. Я кілька разів шукав у Google, і очевидно, люди, які використовують Maven, це якось вирішили, але я не використовую Maven, а також хлопець, який написав цей підручник.

Просто, щоб перевірити, чи взагалі com.sun.jersey.spi.container.servlet.ServletContainerіснує в імпортованих, Jersey jarsя спробував просто написати це повністю кваліфіковане ім'я на Java і дозволити intellisense закінчувати імена, але я не зміг отримати жодного intellisense після, com.sun.jeтому моє останнє припущення полягає в тому, що в останній збірці Джерсі відбулася певна перестановка пакунків і jerseyвже немає всередині com.sun. Я виснажений, і я був би вдячний за будь-яку допомогу.


Як ти встановив Джерсі? Я не можу отримати доступ до нічого нижче версії 2.29, а стаття розповідає про 2.11?
піксель

Відповіді:


155

Ви завантажили Джерсі 2 (який RI JAX-RS 2). Підручник, на який ви посилаєтесь, використовує Jersey 1. Завантажте Jersey 1.17.1 з ( тут ), вам має бути достатньо.

Джерсі 1 використовує com.sun.jersey, а Джерсі 2 використовує, org.glassfish.jerseyотже, виняток.

Також зверніть увагу, що також init-paramпочинаючи з com.sun.jerseyне буде визнано Джерсі 2.

Редагувати

Реєстрація ресурсів та постачальників у Джерсі 2 містить додаткову інформацію про те, як реєструвати класи / екземпляри в Джерсі 2.


2
+1. Як доповнення для інших із подібними проблемами буде корисним прочитати офіційний Посібник користувача Джерсі: Глава 4. Розгортання веб-служби RESTful
informatik01,

6
новий клас для сервлета-контейнера - "org.glassfish.jersey.servlet.ServletContainer"
cljk

4
сервлет-клас: org.glassfish.jersey.servlet.ServletContainer, init-param-name: jersey.config.server.provider.packages.
пікмейт 涅

1
Ця відповідь добре пояснює причину проблеми / помилки, але залишає рішення дуже відкритим. Тому що з невеликою кількістю наданої вами інформації я не міг вирішити свою проблему. Деякі подробиці файлів pom.xml, web.xml та java можуть зробити кращу роботу. Або зверніться до блогу чи статті, яка спрямовує читача на підручник для Джерсі 2.x
Пауло Олівейра,

1
@Siddharth пов'язана стаття мала показати деякі підходи до вирішення цієї проблеми. Якщо ви знайдете якусь інформацію, відсутню в цій статті, повідомте мене. Або ви завжди можете надати своє рішення як відповідь на це питання.
Michal Gajdos

34

Якщо ви використовуєте jersey 2.x, то вам потрібна інша конфігурація в web.xml, оскільки клас сервлетів змінюється в ньому. Ви можете оновити свій web.xml з наступною конфігурацією.

    <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
Вам насправді потрібна одиниця: WidgetPU ? Я думаю, що відповідь можна спростити, видаливши її.
Микита Босік

1
Цей параметр не пов’язаний з одиницею <init-param> <param-name>: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan

22

Додайте це в пом

<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 - це залежність сервера-джерсі, і багато хто не потрібно буде додавати явно
Kalpesh Soni

Добре, що з нами трапилося, ми зіткнулися з джерсі-сервером з 1.0.2 до 1.11, і клас "ServletContainer" раптом став AWOL. Схоже, його було переміщено в цій та майбутніх версіях до пакету jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

Це проблема встановлення затемнення, а не проблема Джерсі.

З цього потоку ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Клацніть правою кнопкою миші властивості проекту eclipse -> Асамблея розгортання -> Додати -> Записи шляху побудови Java -> Залежності Gradle -> Готово.

Отже, Eclipse не використовував залежності Gradle, коли Apache запускався.


1
Витратив стільки часу на це питання, врятував мені день!
Тушар Тхакур


2

У мене була та сама проблема, що і у вас, хоча я дотримувався іншого посібника: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Дивна частина є те, що в цьому керівництві я використовував, я не повинен мати жодних - або проблем із сумісністю між версіями (1.x від 2.x) , тому що після керівництва ви використовуєте майку 1.8.x на pom.xmlі в web.xmlзасланні на клас ( com.sun.jersey.spi.container.servlet.ServletContainer), як зазначено раніше версії 1.x. Тож, як я можу зробити висновок, це повинно працювати.

Я думаю , тому що я використовую JDK 1.7, цей клас уже не існує.


Після того, як я спробував рішучістю з відповідями , перш ніж у мене, не допомогло, я зробив зміни на pom.xmlі на web.xmlпомилки змінено на наступне :java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Які нібито повинні існувати!

В результаті цієї помилки я знайшов "нове" рішення: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

За допомогою Maven (архетипи) створити джерсі-проект, подобається це:

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

І мені це вдалося! :)


2

Я теж стикався з подібною проблемою. Вирішено проблему, пройшовши покроковий посібник із посилання нижче.

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

  • Головне, на що слід звернути увагу, - це те, що бібліотеки джерсі повинні бути правильно розміщені в папці TOMCAT WEB-INF / lib. Це робиться автоматично за допомогою налаштувань Eclipse, згаданих у посиланні вище. Він створить файл WAR із залежними файлами JAR. В іншому випадку у вас виникнуть проблеми з винятком ClassNotFound.

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

"23.11.2014 00:06 130 458 трикотаж-клієнт-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 Файл (и) 1 450 238 байт

  • Другий посібник пояснює, як створити веб-службу, яка виробляє та споживає вихідні дані JSON.

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

Обидва посилання дали хорошу картину того, як все працює, і заощадили багато часу.


1

Ми отримуємо цю помилку через проблему шляху побудови. Вам слід додати бібліотеки " Runtime Server " у шлях побудови.

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

Будь ласка, виконайте кроки нижче, щоб вирішити виняток класу не знайдено.

Клацніть правою кнопкою миші project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0


0

Сьогодні я зіткнувся з тією ж помилкою, хоча використовував Jersey 1.x і мав правильні банки у своєму класі. Тим, хто хоче дотримуватися підручника з вогелли до листа та використовувати банки 1.x, вам потрібно додати бібліотеки трикотажів до папки WEB-INF / lib. Це, безумовно, вирішить проблему.


У мене така сама помилка (з використанням версії 1.18.1 jersey-server, jersey-core, jersey-servlet), але розірваний артефакт, який створює IntelliJ Idea, - це одна папка WEB-INF із папкою класів всередині та файлом web.xml. папка містить лише Hello.class
skiabox

0

вам потрібно додати jersey-bundle-1.17.1.jarдо lib проекту

<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

Ви повинні замінити у своєму 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>

для цього:

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

це Jersey 2.x використовує пакети org.glassfish.jersey замість com.sun.jersey (який використовується Jersey 1.x) і, отже, виняток. Зверніть увагу, що також init-param, що починається з com.sun.jersey, не буде розпізнаний Jersey 2.x після переходу на JAX-RS 2.0 та Jersey 2.x

якщо в будь-який момент ви використовуєте maven, ваш pom.xml буде таким:

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

замініть 2.X на бажану версію, наприклад 2.15


0

Просте обхідне рішення - перевірити, чи є у вас залежності чи libs у складі розгортання eclipse. Ймовірно, якщо ви використовуєте tomcat, сервер, можливо, не визначив ті бібліотеки, які ми використовуємо. у такому випадку вкажіть це явно в збірці розгортання.


0

Повертаючись до початкової проблеми - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Як справедливо сказано вище, у версії JAX 2.x клас ServletContainer було переміщено до пакета - org.glassfish.jersey.servlet.ServletContainer. Пов’язана банка - jersey-container-servlet-core.jar, яка поставляється в комплекті з jaxrs-ri-2.2.1.zip

JAX RS можна розробити без mvn, скопіювавши вручну всі баночки, що містяться у zip-файлі jaxrs-ri-2.2.1.zip (я використовував цю версію, могла б працювати з будь-якою версією 2.x), у папку WEB-INF / lib. Копіювання бібліотек у праву папку робить їх доступними під час виконання.

Це потрібно, якщо ви використовуєте eclipse для побудови та розгортання вашого проекту.


0

У файл pom.xml нам потрібно додати

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

0

Та сама помилка і витрачена понад 2 години налагодження та випробування всіх варіантів. Я не використовував Maven / POM, тому я не міг використати це рішення, дане кількома.

Нарешті, це вирішили: додавання банок безпосередньо до папки tomcat / lib (НЕ WEB-INF \ lib) та перезапуск tomcat.


0

Якщо хтось намагається створити додаток hello world за допомогою Джерсі, я думаю, що одним із найпростіших способів є дотримання документації Джерсі.

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

Якщо ви вже використовуєте maven, результат знадобиться всього кілька хвилин.

Я використовував нижче.

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

0

В основному це залежить від того, яку версію трикотажу ви використовуєте. Якщо ви використовуєте Jersey ver.1.XX, вам потрібно додати

Джерсі 1 використовує " com.sun.jersey ", а Джерсі 2 використовує org.glassfish . на тезі класу сервлетів. Також зверніть увагу, що також init-param, що починається з com.sun.jersey, не буде розпізнаватися Jersey 2.

І додайте весь файл jar у папку lib WEB-INF

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.