Java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Вы можете почувствовать, что это дублированный вопрос, но ни один из вопросов с тем же названием не решает моих проблем. Я использую Джерси 2.0, создавая веб-службу RESTful в Eclipse, я использую Tomcat 7.0 в качестве моего сервера, у меня есть следующий 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" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
  <servlet>
    <servlet-name>JAX-RS Servlet</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.shop.domain</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>JAX-RS Servlet</servlet-name>
    <url-pattern>/jaxrs/*</url-pattern>
  </servlet-mapping>
</web-app>

У меня есть простой класс Hello:

@Path("customers")
public class Hello {
    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String getCustomer() {
        return "hello";
    }
}

У меня есть библиотека Джерси под названием jersey:

enter image description here

Каждый раз, когда я запускал этот проект, я получал ошибку

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Любые идеи?

Ответ 1

Подождите, вы сказали, что у вас есть библиотека Джерси под названием jersey, вы создали User Library и назовите ее jersey? Если это так, попробуйте скопировать файлы jersey jar в WebContent → WEB-INF → lib.

Ответ 2

Я думаю, это уже ответили, но просто хотел добавить дополнительный совет.

Для веб-проектов в Eclipse почти всегда желательно управлять зависимостями с Maven. Используйте плагин Maven, например, m2e. После добавления зависимости к вашему проекту Maven он должен автоматически развернуть эти библиотеки в WEB-INF/lib. Если это не так (по каким-либо причинам), вы можете сделать это так:

  • Щелкните правой кнопкой мыши свой проект в Проводнике проекта
  • Выберите Свойства
  • Выберите Развертывание сборки
  • Если Maven Dependencies не является одной из записей, библиотеки не добавляются автоматически, поэтому мы добавим их сейчас
  • Выберите Добавить
  • Выберите Записи пути сборки Java
  • Выберите Зависимости Maven
  • Нажмите Готово

Это должно добавить библиотеки в WEB-INF/lib, хотя вы все равно не увидите их в представлении Project Explorer. Но ваш ClassNotFoundException должен исчезнуть.

Ответ 3

В то время как все вышеперечисленное может применяться (Eclipse - не самое надежное приложение), убедитесь, что вы дважды проверили ваши зависимости maven. Следует отметить, что для jersey 2.19 мне пришлось добавить эти 2 зависимости maven:

    <dependency>
        <groupId>org.glassfish.jersey.containers</groupId>
        <artifactId>jersey-container-servlet</artifactId>
        <version>2.19</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jersey.core</groupId>
        <artifactId>jersey-server</artifactId>
        <version>2.19</version>
    </dependency>

Ответ 4

У меня возникла проблема с Eclipse. Мой проект, который имеет очень похожую настройку - Jersey 2, Tomcat 7. Я запускаю tomcat из внутреннего затмения, и кажется, что где-то по пути затмение вроде забыло, как правильно развернуть библиотеки для tomcat.

Я попытался развернуть мой файл войны вручную в tomcat и запустить его через startup.sh, и он работал нормально, но если я запустил его через eclipse, я получаю свой веб-контент, но классов Джерси не существует, поэтому API REST Не работай. Мой сервлет серфинга работает отлично, просто не бит трикотажа. Консоль имеет ту же ошибку:

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

при запуске. Поэтому, должно быть, проблема с тем, как eclipse развертывает код для tomcat. Я попытался войти в серверы eclipse и очистить рабочий каталог, ничего не сделал. (не для того, чтобы это было, для отсутствующих классов).

Единственное, что сработало, - это настроить конфигурацию моих серверов в Eclipse и удалить мою запись tomcat, а затем создать новую. Я сделал это, и он сразу исправил его.

Ответ 5

Я также наблюдаю ту же проблему. Я использую tomcat8 с Maven. Если я создам динамический веб-проект и добавляю все библиотеки вручную, проект работает нормально, но если я использую Maven, он дает следующую ошибку:

SEVERE: Servlet [Jersey REST Service] in web application [/EmployeeManagement] threw load() exception
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1313)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1164)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:520)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:501)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:120)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1095)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1031)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4914)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5201)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1408)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1398)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:744)

Я добавил следующие maven-зависимости в файле pom.xml:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.21</version>
</dependency>
    <dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet-core</artifactId>
    <version>2.21</version>
</dependency>

Ответ 6

Поместите файлы jersey в WEB-INF/lib.

Если вы не можете поместить свои файлы jersey jar в WEB-INF/lib, попробуйте скопировать его в ручную, пройдя свое рабочее пространство и перезагрузив eclipse! Это сработало для меня.

Ответ 7

Для меня исправление делало это:

Right click on Project -> Properties -> Java Build Path -> Libraries ->
Add Library... -> Server Runtime -> Apache Tomcat v7.0 -> Finish

Еще один шаг, который я сделал, - это импортировать материал в Maven, но он не был необходим, поскольку он отлично работает без него.

Но вот, если это кому-то помогает

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>servlet-api</artifactId>
        <version>2.5</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>jsp-api</artifactId>
        <version>2.2.1-b03</version>
        <scope>provided</scope>
    </dependency>

размещение сервлетов в WEB-INF/lib просто усложнило ситуацию, поскольку сообщение об исключении стало более сложным и неуместным

EDIT: oh также помогает сделать проект обновления в вашем проекте Maven.

Ответ 8

Добавьте библиотеку Jersey в путь сборки в библиотеке

Ответ 9

Я хотел бы добавить, у меня была такая же проблема, и ответ @Edin работал, однако я использовал IntelliJ. Поэтому я думал, что добавлю способ сделать это для Intellij (для будущих людей, таких как я):

  • Файл
  • Структура проекта
  • Артефакты
  • У вас должен быть Артефакт, названный в честь вашего проекта, выберите его
  • Справа вы увидите список доступных элементов
  • Выберите все доступные элементы, щелкните правой кнопкой мыши, затем выберите параметр, который добавит их в WEB-INF/Lib