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

Вы загрузили Jersey 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, имя-параметра-инициализации: jersey.config.server.provider.packages.
picmate 涅

1
Этот ответ хорошо объясняет причину проблемы / ошибки, но оставляет решение очень открытым. Потому что с той небольшой информацией, которую вы предоставили, я не смог решить свою проблему. Некоторые дополнительные сведения о файлах pom.xml, web.xml и java могут помочь. Или отсылайте блог или статью, которая направляет читателя к учебному пособию по Jersey 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> unit: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan

22

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

2
jersey-core - это зависимость от jersey-server, и многие из них не нужно добавлять явно
Калпеш Сони

Хорошо, что с нами произошло: мы переместили jersey-server с 1.0.2 на 1.11, и класс "ServletContainer" внезапно стал самоволкой. Похоже, в этой и будущих версиях он был перемещен в пакет jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack

15

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

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

Щелкните правой кнопкой мыши свой проект eclipse Properties -> Deployment Assembly -> Add -> Java Build Path Entries -> Gradle Dependencies -> Finish.

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


1
Столько времени потратил на этот вопрос, спас мне день!
Тушар Тхакур


2

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

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

  • Главное отметить, что библиотеки jersey должны быть правильно размещены в папке 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 12:06 130 458 jersey-client-1.9.jar

23.11.2014 0:06 458739 jersey-core-1.9.jar

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

23.11.2014 12: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

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

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

Выполните следующие действия, чтобы разрешить исключение class not found.

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


0

Сегодня я столкнулся с той же ошибкой, хотя я использовал Jersey 1.x и имел правильные jar-файлы в моем пути к классам. Для тех, кто хотел бы досконально изучить руководство по vogella и использовать jar-файлы 1.x, вам нужно добавить библиотеки jersey в папку 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в библиотеку проекта

<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

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


0

Возвращаясь к исходной проблеме - 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. Копирование библиотек в нужную папку делает их доступными во время выполнения.

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


0

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

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

0

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

Наконец, следующее разрешило это: добавление jar-файлов непосредственно в папку 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, не будет распознан Джерси 2.

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.