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.