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

Я пытаюсь создать простое приложение 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 отсюда и добавили все файлы JAR в WEB-INF/lib папка, как описано в учебнике. И даже через два дня ничего не работает. Я несколько раз искал в Google, и, очевидно, люди, которые используют Maven, решили это как-то, но я не использую Maven, как и тот, кто написал это руководство.

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

20 ответов

Решение

Вы скачали Джерси 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.

Если вы используете 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>

Добавьте это в пом

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

Это проблема настройки затмения, а не проблема Джерси.

Из этого потока ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Щелкните правой кнопкой мыши свой проект eclipse Свойства -> Сборка развертывания -> Добавить -> Записи пути сборки Java -> Зависимости Gradle -> Готово.

Таким образом, Eclipse не использовал зависимости Gradle при запуске Apache.

Попробуй это:

org.glassfish.jersey.servlet.ServletContainer

на сервлет-классе

Я также столкнулся с подобной проблемой. Решил проблему, пройдя пошаговое руководство по ссылке ниже.

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

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

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 0:06 458 739 jersey-core-1.9.jar

23.11.2014 0:06 147 952 jersey-json-1.9.jar

23.11.2014 0: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/

Обе ссылки дали хорошее представление о том, как все работает и сэкономили много времени.

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

Странно то, что в этом руководстве, которое я использовал, у меня не должно быть проблем с совместимостью версий (1.x против 2.x), потому что, следуя руководству, вы используете jersey 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

И это сработало для меня!:)

Мы получаем эту ошибку из-за ошибки пути сборки. Вы должны добавить библиотеки "Server Runtime" в Build Path.

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

Пожалуйста, следуйте приведенным ниже инструкциям, чтобы разрешить класс не найденное исключение.

Щелкните правой кнопкой мыши на project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

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

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

Если кто-то пытается создать приложение hello world с использованием Jersey, я думаю, что один из самых простых способов - следовать документации Jersey.

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

Если вы уже используете Maven, вам понадобится всего несколько минут, чтобы увидеть результат.

Я использовал ниже.

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

В моем случае это сработало после добавления jar-пакета jersey-bundle в мою библиотеку tomcat.

Это могут быть ваши зависимости, смешанные с версией, и убедитесь, что эти зависимости добавлены в файл 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>

После этого щелкните правой кнопкой мыши свой проект eclipse «Свойства» -> «Сборка развертывания» -> «Добавить» -> «Записи пути сборки Java» -> «Зависимости maven» -> «Готово».

Теперь проверьте. После проверки правильности части отображения сервлета.

Ссылки : Веб-сервисы RESTful с использованием Джерси

      <servlet>
<servlet-name>RestServices</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.javaproficiency.jerseydemo.demo</param-value>
</init-param>

<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestServices</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>

Я столкнулся с той же ошибкой сегодня, хотя я использовал Джерси 1.x, и у меня были правильные банки в моем classpath. Для тех, кто хочет следовать руководству по vogella письму и использовать jar 1.x, вам нужно добавить библиотеки jersey в папку WEB-INF/lib. Это, безусловно, решит проблему.

В файл pom.xml нам нужно добавить

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

Простой обходной путь: проверьте, есть ли у вас зависимости или библиотеки в сборке развертывания eclipse. Вероятно, если вы используете tomcat, сервер может не определить библиотеки, которые мы используем. в этом случае укажите это явно в сборке развертывания.

Это в основном зависит от того, какую версию трикотажа вы используете. Если вы используете Джерси ver.1.XX, вам нужно добавить

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

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

Вы должны заменить в своем файле 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

Та же ошибка и впустую потратила 2+ часа на отладку и пробовал все варианты. Я не использовал Maven/POM, поэтому я не мог использовать это решение, данное немногими.

Наконец, следующее решило это: добавление jar-файлов непосредственно в папку tomcat / lib (NOT WEB-INF \ lib) и перезапуск tomcat.

Возвращаясь к исходной проблеме - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Как справедливо сказано выше, в версии JAX 2.x класс ServletContainer был перемещен в пакет - org.glassfish.jersey.servlet.ServletContainer. Связанный jar - это jersey-container-servlet-core.jar, который входит в состав jaxrs-ri-2.2.1.zip

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

Это необходимо, если вы используете eclipse для создания и развертывания вашего проекта.

Добавьте зависимость «jersey-spring» в ваш файл pm, чтобы решить проблему, поскольку он содержит необходимые файлы, которые находит tomcat.

Другие вопросы по тегам