ClassNotFoundException при запуске tomcat
Я пытаюсь создать веб-службу 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:
[email protected]
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>
Кто-нибудь может мне помочь?
Ответы
Ответ 1
Я столкнулся с той же проблемой. Я использовал версию 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 разрешило эту проблему.
Надеюсь, что это поможет.
Ответ 2
Решение:
Добавляйте только зависимость в 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.
Чтобы проверить:
Щелкните правой кнопкой мыши свой проект → Свойства → Ассемблер развертывания и убедитесь, что вкладка "Источник" содержит Maven Dependecies.
В противном случае:
Нажмите кнопку Add → Java Build Path → Maven Dependecies → Finish.
Готов, когда вы запускаете приложение, все libs будут импортированы в развертывание.
ps: Если проект Maven обновлен, вы должны переделать эти шаги.
Ответ 3
Если вы работаете с Maven, то возможная проблема может заключаться в том, что ваши баннеры не будут развернуты на вашем Tomcat.
Итак, у вас есть зависимости Maven в пути сборки Java (Project > Properties > Build path), но при запуске проекта на вашем Tomcat из Eclipse Maven Dependencies не развертываются в TOmcat. Чтобы решить эту проблему, вам необходимо: щелкнуть правой кнопкой мыши > свойства и выбрать "Сборка развертывания". И добавьте записи Java Build Path. Таким образом, вы сообщаете плагин WTP (тот, который работает с Tomcat внутри Eclipse), что он также должен скопировать банки Maven
![enter image description here]()
Ответ 4
В Джерси 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
Ответ 5
Вам нужно разместить JAR Джерси в каталоге WEB-INF/lib, независимо от того, используете ли вы Tomcat отдельно или работаете с Eclipse.
Это сработало для меня.
Ответ 6
загрузчик классов не может найти класс 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, но вы действительно не понимаете, что они делают.
В каталог Tomcat /webapps
должен входить файл WAR, в котором есть все сторонние JAR-адреса, которые вам нужны в каталоге WEB-INF/lib
. Если вы этого не сделаете, Tomcat их не найдет.
Я бы рекомендовал упростить вашу проблему. Создайте файл WAR вручную; покиньте Eclipse и Maven. После того, как вы заработаете, добавьте вещи, которые должны облегчить вашу жизнь. Вы поймете, что им нужно сделать, потому что вы уже сделали это без них.
Ответ 7
Сообщение luigi7up выше работало для меня. Я использую tomcat 7.0.37, maven 3.1.1 и jersey 1.17.1. Я сделал правый клик → свойства → сборка развертывания → нажмите Add → Java Build Path Entries → selected Maven Dependencies. Затем я нажал ОК.
Когда я впервые попробовал это, я заметил, что я больше не получил ошибку "java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer", но затем я заметил, что получаю другую " class not found '(к сожалению, я не документировал, какие сообщения были). Я использовал следующую зависимость от трикотажа:
<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>
После этого начали работать.
Надеюсь, это поможет кому-то!
Ответ 8
Я добавил его в каталог WEB-INF/lib
, но он не работал, пока я не обновил папку lib из Eclipse, а затем начал работать.
Ответ 9
Anjaneya Reddy, как вы уже указали, класс даже не в JAR, в котором он должен быть. Что меня озадачивает, где оно и где в документации затрагивает это?!?
С тем, что сейчас так дружит с Maven, трудно выпустить простой учебник, не задумываясь о нем.
Ответ 10
Вам, видимо, необходимы отсутствующие библиотеки из вашего пути к классам развертывания.
Скопируйте следующие банки в каталог 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
Ответ 11
from: http://jersey.java.net/nonav/documentation/latest/chapter_deps.html#d4e1687
Развертывание приложения в контейнере сервлета требует зависимости развертывания с этим контейнером.
См. документацию по Java здесь о том, как настроить контейнер сервлета.
Использование сервлета: com.sun.jersey.spi.container.servlet.ServletContainer требует зависимости от модуля jersey-servlet.
Разработчики Maven, использующие сервлет: com.sun.jersey.server.impl.container.servlet.ServletAdaptor в сервлете, отличном от EE 5, требуют зависимости от модуля persistence-api.
Разработчики Non-Maven требуют: persistence-api.jar
Ответ 12
Следующая зависимость помогает:
<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/