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

Я пытаюсь создать простое приложение-приложение hello world в течение двух дней, используя механизм Google + 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 построена некоторая перестановка пакетов, а jersey больше не находится внутри com.sun. Я измучен, и я буду признателен за любую помощь.

Ответ 1

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

Джерси 1 использует com.sun.jersey, а Джерси 2 использует org.glassfish.jersey, следовательно, исключение.

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

Изменить

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

Ответ 2

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

Ответ 3

Добавьте это в 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>

Ответ 4

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

Из этой темы ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

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

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

Ответ 5

попробуйте следующее:

org.glassfish.jersey.servlet.ServletContainer

в классе сервлетов

Ответ 6

У меня была такая же проблема, как и вы, хотя я пошел по другому руководству: 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

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

Ответ 7

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

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

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

апач-7.0.56-Tomcat-Windows-x64\апач -tomcat-7.0.56\WebApps\JerseyJSONExample\WEB-INF\Lib

"11/23/2014 12:06 утра 130 458 джерси-клиент-1.9.jar

11/23/2014 12:06 утра 458 739 джерси-ядро-1.9.jar

11/23/2014 12:06 AM 147,952 jersey-json-1.9.jar

11/23/2014 12:06 713 089 джерси-сервер-1.9.jar "              4 файлов 1,450,238 байт

  • Во втором учебном пособии объясняется, как создать веб-сервис, который производит и потребляет выходные данные JSON.

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

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

Ответ 8

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

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

Чтобы устранить исключение класса, не найденное, выполните следующие шаги.

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

Ответ 9

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

Ответ 10

вам нужно добавить 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>

Ответ 11

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

это Джерси 2.x использует пакеты org.glassfish.jersey вместо com.sun.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

Ответ 12

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

Ответ 13

Возвращаясь к исходной проблеме - 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 (i использовали эту версию, будут работать с любой версией 2.x) в папку WEB-INF/lib. Копирование libs в правую папку делает их доступными во время выполнения.

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

Ответ 14

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

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

Ответ 15

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

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

Ответ 16

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

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

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

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

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