org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException

时间:2014-02-25 17:47:56

标签: java tomcat jersey glassfish classnotfoundexception

我一直在使用org.glassfish.jersey.servlet.ServletContainer获得一个ClassNotFoundException,但是当我尝试使用Eclipse Juno启动/重新启动我的Tomcat服务器(v7)时,它特别启动了。

不确定发生了什么。奇怪的是,它刚刚开始发生,因为它在那之前完美运作。

这是stacktrace:

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文件仍然存在于WEB-INF / lib中:

WEB-INF/lib with jersey jars

9 个答案:

答案 0 :(得分:82)

问题:

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

表示您尝试使用 Jersey 2.x servlet,但是您正在提供 Jersey 1.x 库。

对于 Jersey 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 documentation

如果您想使用 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>

对于 Jersey 2.x ,您不需要在web.xml中设置任何内容,只需提供与此类似的类:

import javax.ws.rs.ApplicationPath;
import javax.ws.rs.core.Application;

@ApplicationPath("rest")
public class ApplicationConfig extends Application {

}

有关详细信息,请查看Jersey documentation

另见:

答案 1 :(得分:20)

这是一个日食设置问题,而不是泽西岛问题。

从这个线程ClassNotFoundException:org.glassfish.jersey.servlet.ServletContainer

右键单击您的eclipse项目Properties - &gt;部署组件 - &gt;添加 - &gt; Java构建路径条目 - &gt; Gradle Dependencies - &gt;完成。

因此Eclipse在Apache启动时没有使用Gradle依赖项。

答案 2 :(得分:11)

如果您使用 Jersey 2.x ,请使用以下依赖项:

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

XX可以是您寻找的任何特定版本。 Jersey Containers

答案 3 :(得分:3)

以下代码在web.xml文件中为我工作

$start_date = new DateTime('2015-11-15 10:00:00');
$since_start = $start_date->diff(new DateTime('2015-11-17 12:12:25'));
echo $since_start->days.' days total<br>';
echo $since_start->y.' years<br>';
echo $since_start->m.' months<br>';
echo $since_start->d.' days<br>';
echo $since_start->h.' hours<br>';
echo $since_start->i.' minutes<br>';
echo $since_start->s.' seconds<br>';

答案 4 :(得分:3)

我同意接受的答案。但对我来说,问题并非如此,而是我必须修改我的Servlet-Class名称: -

要:

<servlet-class>org.glassfish.jersey.servlet.ServletContainer.class</servlet-class> 

因此,删除.class在我的情况下工作得很好。希望它能帮助别人!

答案 5 :(得分:1)

jersey-container-servlet实际上使用了jersey-container-servlet-core依赖项。但是,如果您使用Maven,那并不重要。如果仅定义jersey-container-servlet用法,它也会自动下载依赖项。

但是对于那些手动将jar文件添加到项目中的人(即没有maven的人),重要的是要知道您实际上同时需要两个jar文件org.glassfish.jersey.servlet.ServletContainer类实际上是核心依赖项的一部分。

答案 6 :(得分:1)

如果您不使用maven,请尝试将您的jar放入WEB-INF / lib,它对我有用。

答案 7 :(得分:0)

假设您使用的是Jersey 2.25.1,这对我有用 - 我正在使用Apache Tomcat Web容器:

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

注意:用您正在使用的版本替换版本

答案 8 :(得分:0)

我遇到了与eclipse相同的问题,WA解决方案是将libs复制到WEB-INF / lib