it-roy-ru.com

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

Вы можете подумать, что это дублированный вопрос, но ни один из вопросов с таким же названием не решает мои проблемы. Я использую Jersey 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

Есть идеи?

11
Tom

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

3
Zhenxiao Hao

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

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

  1. Щелкните правой кнопкой мыши свой проект в Project Explorer
  2. Выберите Свойства
  3. Выбрать Сборка развертывания
  4. Если Maven Dependencies не является одной из записей, библиотеки не были добавлены автоматически, поэтому мы добавим их сейчас
  5. Выберите Добавить
  6. Выбрать Записи пути сборки Java
  7. Выберите Maven Dependencies
  8. Нажмите Готово

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

19
Ebin

Хотя все вышесказанное может применяться (Eclipse - не самое надежное приложение), убедитесь, что вы дважды проверили свои зависимости maven. Вы должны заметить, что для Джерси 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>
5
Pantelis Natsiavas

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

Я попытался вручную развернуть мой war-файл в Tomcat и запустить его с помощью startup.sh, и он работал нормально, но если я запускаю его через Eclipse, я получаю свой веб-контент, но классов Jersey нет, поэтому API REST не ' т работа. Мой сервлет входа работает нормально, только не бит джерси. Консоль имеет ту же ошибку:

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

на старте. Так что проблема в том, как Eclipse развертывает код в Tomcat. Я пытался зайти на серверы Eclipse и очистить каталог, ничего не сделал. (не то, что было бы, для пропущенных классов). 

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

1
Damon Smith

Сообщение достаточно просто, чтобы определить причину, по которой библиотеки Джерси не находятся в classpath.

Первое, что вы должны проверить, есть ли у вас зависимости для джерси, определенные в вашем файле pom.xml или нет . Если нет, то здесь вы можете определить зависимости, если они уже определены в pom. xml, игнорируйте добавление зависимостей в ваш pom.xml. 

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

Решение - добавить библиотеку Джерси в сборку развертывания

1. Щелкните правой кнопкой мыши ваш проект в Project Explorer

2. Откройте конфигурацию сборки вашего проекта.

 enter image description here

3. Добавьте файлы сборки пути сборки в сборку, чтобы их можно было добавить в Папка lib в файле окончательной войны.

 enter image description here

4. Обновленная сборка будет выглядеть так.

 enter image description here

Нажмите ОК . Теперь все готово.

1
Varun

Я также наблюдаю ту же проблему. Я использую Tomcat8 с Maven. Если я создаю Dynamic Web Project и добавляю все библиотеки вручную, проект работает нормально, но если я использую 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>
0
Devil

Добавить библиотеку Джерси в путь сборки под библиотекой

0
Mohit Singh

Помещение jersey jar files в WEB-INF/lib должно работать.

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

0
saravana kumaran

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

  1. Файл
  2. Структура проекта
  3. Артефакты
  4. У вас должен быть Артефакт, названный в честь вашего проекта, выберите его
  5. Справа вы увидите список Доступные элементы
  6. Выберите все доступные элементы, щелкните правой кнопкой мыши, затем выберите параметр, который добавляет их в WEB-INF/Lib
0
Miniman

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

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 только усложняло ситуацию, поскольку сообщение об исключении становилось все более сложным и неактуальным

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

0
kaya