org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException
Я получаю ClassNotFoundException с org.glassfish.jersey.servlet.ServletContainer
но он начался прошлой ночью, когда я попытался запустить / перезапустить свой сервер Tomcat (v7) с Eclipse Juno.
Не уверен что происходит. Что странно, так это то, что это только начало происходить прошлой ночью, в то время как до этого все работало на отлично.
Вот трассировка стека:
Feb 25, 2014 11:11:19 AM org.apache.catalina.core.ApplicationContext log
INFO: Marking servlet com.att.ucomm.admin.UCommAdminFunctions as unavailable
Feb 25, 2014 11:11:19 AM org.apache.catalina.core.StandardContext loadOnStartup
SEVERE: Servlet /UCommAdminFunctions threw load() exception
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1671)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1516)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:415)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:397)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:118 )
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1048)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:996)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4762)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5045)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:140)
at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3670)
at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1207)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1393)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1403)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1403)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1382)
at java.lang.Thread.run(Unknown Source)
Feb 25, 2014 11:11:19 AM org.apache.catalina.core.StandardContext reload
INFO: Reloading Context with name [/UCommAdminFunctions] is completed
Feb 25, 2014 11:13:33 AM org.apache.catalina.core.StandardWrapperValve invoke
INFO: Servlet com.att.ucomm.admin.UCommAdminFunctions is currently unavailable
Вот мой web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5"
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_2_5.xsd">
<servlet>
<servlet-name>com.att.ucomm.admin.UCommAdminFunctions</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<!-- Register JAX-RS Application, if needed. -->
<init-param>
<param-name>com.att.ucomm.admin.UCommAdminFunctions</param-name>
<param-value>my.package.MyApplication</param-value>
</init-param>
<!-- Register resources and providers under my.package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>com.att.ucomm.admin</param-value>
</init-param>
<!-- Register my custom provider (not needed if it's in my.package) AND LoggingFilter. -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>com.att.ucomm.admin.SecurityRequestFilter;org.glassfish.jersey.filter.LoggingFilter</param-value>
</init-param>
<!-- Enable Tracing support. -->
<init-param>
<param-name>jersey.config.server.tracing</param-name>
<param-value>ALL</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>com.att.ucomm.admin.UCommAdminFunctions</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
</web-app>
Я убедился, что файлы jar для jersey все еще есть в WEB-INF/lib:
10 ответов
Эта проблема:
java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
указывает на то, что вы пытаетесь использовать сервлет Jersey 2.x, но поставляете библиотеки Jersey 1.x.
Для Джерси 1.x вы должны сделать это так:
<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>sample.hello.resources</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>
Для получения дополнительной информации обратитесь к документации Jersey 1.x.
Если вместо этого вы захотите использовать Jersey 2.x, вам придется поставлять библиотеки Jersey 2.x. В проекте на основе Maven вы можете использовать следующее:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.xx</version>
</dependency>
<!-- if you are using Jersey client specific features without the server side -->
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.xx</version>
</dependency>
Для Джерси 2.x вам не нужно ничего настраивать в своем web.xml
достаточно указать класс, подобный следующему:
import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;
@ApplicationPath("rest")
public class ApplicationConfig extends Application {
}
Для получения дополнительной информации проверьте документацию Джерси.
Смотрите также:
Это проблема настройки затмения, а не проблема Джерси.
Из этой темы ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
Щелкните правой кнопкой мыши свой проект eclipse Свойства -> Сборка развертывания -> Добавить -> Записи пути сборки Java -> Зависимости Gradle -> Готово.
Таким образом, Eclipse не использовал зависимости Gradle при запуске Apache.
Если вы используете Jersey 2.x, используйте следующую зависимость:
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.XX</version>
</dependency>
куда XX
может быть любая конкретная версия, которую вы ищете. Джерси Контейнеры.
Я согласен с принятым ответом. Но для меня проблема была не в том, что вместо этого мне пришлось изменить имя класса сервлетов из:-
<servlet-class>org.glassfish.jersey.servlet.ServletContainer.class</servlet-class>
Для того, чтобы:
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
Таким образом, удаление.class работало нормально в моем случае. Надеюсь, это кому-нибудь поможет!
Ниже код работает для меня в файле web.xml
<servlet>
<servlet-name>WebService</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.example.demo.webservice</param-value>
//Package
</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>WebService</servlet-name>
<url-pattern>/webservices/*</url-pattern>
</servlet-mapping>
Если вы не используете maven, попробуйте поместить ваши jar-файлы в WEB-INF/lib, у меня это сработало.
jersey-container-servlet
на самом деле использует jersey-container-servlet-core
зависимость. Но если вы используете Maven, это не имеет значения. Если вы просто определите jersey-container-servlet
использование, оно также автоматически загрузит зависимость.
Но для тех, кто добавляет jar-файлы в свой проект вручную (т.е. без maven), важно знать, что вам действительно нужны оба jar-файла. org.glassfish.jersey.servlet.ServletContainer
класс на самом деле является частью основной зависимости.
У меня была такая же проблема с затмением, WA-решение было скопировать библиотеки в WEB-INF/lib
Мне кажется, что проблема заключалась в том, что Eclipse не распознавал зависимости Maven моего проекта.
Что я сделал:
Щелкните правой кнопкой мыши проект > Настроить > Преобразовать в проект Maven.
Предположим, вы используете Джерси 2.25.1, это сработало для меня - я использую веб-контейнер Apache Tomcat:
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.25.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet</artifactId>
<version>2.25.1</version>
</dependency>
Примечание: замените версию на версию, которую вы используете