ClassNotFoundException при запуске tomcat - PullRequest
24 голосов
/ 09 декабря 2011

Я пытаюсь создать веб-сервис REST.

Мой проект выглядит так:

enter image description here

Отслеживание:

8 déc. 2011 18:31:36 org.apache.catalina.core.AprLifecycleListener init
INFO: The Apache Tomcat Native library which allows optimal performance in production     environments was not found on the java.library.path: C:\Program Files\MyEclipse\Common\binary\com.sun.java.jdk.win32.x86_1.6.0.013\bin;C:\Program Files\MyEclipse\Common\plugins\com.genuitec.eclipse.easie.tomcat.myeclipse_9.0.0.me201109141806\tomcat\bin
8 déc. 2011 18:31:36 org.apache.coyote.http11.Http11Protocol init
INFO: Initialisation de Coyote HTTP/1.1 sur http-8080
8 déc. 2011 18:31:36 org.apache.catalina.startup.Catalina load
INFO: Initialization processed in 394 ms
8 déc. 2011 18:31:37 org.apache.catalina.core.StandardService start
INFO: Démarrage du service Catalina
8 déc. 2011 18:31:37 org.apache.catalina.core.StandardEngine start
INFO: Starting Servlet Engine: Apache Tomcat/6.0.13
8 déc. 2011 18:31:37 org.apache.catalina.startup.HostConfig deployWAR
INFO: Déploiement de l'archive Test-0.0.1-SNAPSHOT.war de l'application web
8 déc. 2011 18:31:37 org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Naya\Workspaces\MyEclipse 10\.metadata\.me_tcat\webapps\Test-0.0.1-SNAPSHOT\WEB-INF\lib\javax.servlet-3.0.1.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
8 déc. 2011 18:31:37 org.apache.catalina.loader.WebappClassLoader validateJarFile
INFO: validateJarFile(C:\Documents and Settings\Naya\Workspaces\MyEclipse 10\.metadata\.me_tcat\webapps\Test-0.0.1-SNAPSHOT\WEB-INF\lib\servlet-api-2.5.jar) - jar not loaded. See Servlet Spec 2.3, section 9.7.2. Offending class: javax/servlet/Servlet.class
8 déc. 2011 18:31:38 org.apache.catalina.core.ApplicationContext log
INFO: La servlet Test JAX-RS REST Servlet est marqué comme indisponible
8 déc. 2011 18:31:38 org.apache.catalina.core.ApplicationContext log
GRAVE: Error loading WebappClassLoader
delegate: false
  repositories:
    /WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@19e8329
 com.sun.jersey.spi.container.servlet.ServletContainer
java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1358)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1204)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1083)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:981)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4042)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4348)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:825)
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:714)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1138)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:566)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)

Мой web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name> 
  <servlet>
    <display-name>Test JAX-RS REST Servlet</display-name>
    <servlet-name>Test JAX-RS REST Servlet</servlet-name>
    <servlet-class>
        com.sun.jersey.spi.container.servlet.ServletContainer
    </servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>Test JAX-RS REST Servlet</servlet-name>
    <url-pattern>/services/*</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

Кто-нибудь может мне помочь?

Ответы [ 12 ]

35 голосов
/ 01 августа 2012

Решение:

Добавить зависимость только в pom.xml:

 <dependency>
      <groupId>com.sun.jersey</groupId>
      <artifactId>jersey-servlet</artifactId>
      <version>1.13</version>
 </dependency>

Теперь ваше приложение будет иметь класс com.sun.jersey.spi.container.servlet.ServletContainer

ps: не забудьте проверить, отправляются ли библиотеки в развертывание tomcat.

Для проверки:

Щелкните правой кнопкой мыши свой проект -> Свойства -> Deployment Assembler и убедитесь, что вкладка Источник содержит Зависимости Maven .

В противном случае:

Нажмите кнопку Добавить -> Путь сборки Java -> Зависимости Maven -> Готово.

Готово, когда вы запускаете приложение, все библиотеки будут импортированы в развертывание.

ps. При обновлении проекта Maven необходимо выполнить следующие действия.

32 голосов
/ 05 июня 2012

Я столкнулся с той же проблемой. Я использовал версию 1.12.

Я не смог найти класс com.sun.jersey.spi.container.servlet.ServletContainer в "jersey-server-1.12.jar" или "jersey-core-1.12.jar", как предлагалось на некоторых других форумах.

Вы можете легко проверить это в Eclipse, добавив его в путь сборки и заметив, что у вас нет этого класса в вышеупомянутых jar-файлах.

Я искал вокруг и нашел следующее:

Похоже, класс com.sun.jersey.spi.container.servlet.ServletContainer находится в другом файле jar ("jersey-servlet-1.12.jar").

Я не нашел никакой документации по этому поводу. Однако наличие этого файла в моем WEB-INF / lib решило эту проблему.

Надеюсь, это поможет.

18 голосов
/ 10 декабря 2012

Если вы работаете с Maven , то возможная проблема может заключаться в том, что ваши банки не будут развернуты на вашем Tomcat.Итак, у вас есть зависимости Maven в пути сборки Java (Project> Properties> Build path), но при запуске проекта на Tomcat из Eclipse Maven Dependencies не развертывается в TOmcat.Чтобы решить эту проблему, вы должны: щелкнуть правой кнопкой мыши> свойства и выбрать «Сборка развертывания».И добавьте записи пути сборки Java.Таким образом, вы говорите плагину WTP (тот, на котором запущен Tomcat в Eclipse), что он также должен копировать файлы Maven enter image description here

9 голосов
/ 11 января 2013

В Джерси 2.0 изменилась реализация контейнера сервлета.Вам нужно использовать org.glassfish.jersey.servlet.ServletContainer вместо старого com.sun.jersey.spi.container.servlet.ServletContainer

Класс находится в

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

Вы можете создать скелетный проект, используя:

mvn archetype:generate -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeGroupId=org.glassfish.jersey.archetypes -
DinteractiveMode=false -DgroupId=com.example -DartifactId=simple-service -Dpackage=com.example -DarchetypeVersion=2.0-m11
3 голосов
/ 24 апреля 2012

Вам необходимо поместить JAR Jersey в каталог WEB-INF / lib , независимо от того, используете ли вы Tomcat отдельно или работаете с Eclipse.

Это сработало для меня.

1 голос
/ 20 января 2014

Пост luigi7up выше работал для меня.Я использую Tomcat 7.0.37, Maven 3.1.1 и Джерси 1.17.1.Я щелкнул правой кнопкой мыши -> Свойства -> Сборка развертывания -> Нажмите Добавить -> Записи пути сборки Java -> Выбранные зависимости Maven.Затем я нажал кнопку ОК.

Когда я впервые попробовал это, я заметил, что больше не получаю ошибку «java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer», нозатем заметил, что я получаю другие сообщения «класс не найден» (к сожалению, я не задокументировал, что это были за сообщения).Я использовал следующую зависимость от джерси:

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-bundle</artifactId>
    <version>1.17.1</version>
</dependency>

Я снял это и добавил следующие зависимости:

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

После этого все заработало.

Надеюсь, это кому-нибудь поможет!

1 голос
/ 09 декабря 2011

Загрузчик классов не может найти класс com.sun.jersey.spi.container.servlet.ServletContainer.

Вам необходимо поместить JAR-файл в свой каталог WEB-INF/lib.

Это может помочь:

http://www.suryasuravarapu.com/2009/02/rest-jersey-configuration-on-tomcat.html

Теперь я посмотрел на изображение, которое вы разместили, и вижу вашу проблему: вы используете Eclipse и Maven, но вы не совсем понимаете, что они делают.

В результате вы должны получить WAR-файл в каталоге Tomcat /webapps, содержащий все необходимые сторонние JAR-файлы в каталоге WEB-INF/lib.Если вы этого не сделаете, Tomcat не найдет их.

Я бы рекомендовал упростить вашу проблему.Создать WAR-файл вручную;оставь Затмение и Мэйвена из этого.Как только у вас все получится, добавьте вещи, которые должны облегчить вашу жизнь.Вы поймете, что им нужно делать, потому что вы уже сделали это без них.

0 голосов
/ 15 июня 2013

Помогает следующая зависимость:

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

См .: http://www.mkyong.com/webservices/jax-rs/classnotfoundexception-com-sun-jersey-spi-container-servlet-servletcontainer/

0 голосов
/ 29 января 2013

from: http://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1687

Для развертывания приложения в контейнере сервлета требуется зависимость развертывания с этим контейнером.

См. Здесь документацию по Java для настройки контейнера сервлета.

Использование servlet: com.sun.jersey.spi.container.servlet.ServletContainer требует зависимости от модуля jersey-servlet.

Разработчики Maven используют servlet: com.sun.jersey.server.impl.container.servlet.ServletAdaptor в сервлете, отличном от EE 5, также требует зависимости от модуля persistence-api.

Разработчики, не являющиеся Maven, требуют: persistence-api.jar

0 голосов
/ 29 ноября 2012

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

Скопируйте следующие файлы в каталог WEB-INF / lib

asm-3.1.jar
jackson-core-asl-1.9.2.jar
jackson-jaxrs-1.9.2.jar
jackson-mapper-asl-1.9.2.jar
jackson-xc-1.9.2.jar
jersey-client-1.15.jar
jersey-core-1.15.jar
jersey-json-1.15.jar
jersey-server-1.15.jar
jersey-servlet-1.15.jar
jettison-1.1.jar
jsr311-api-1.1.1.jar
...