web-dev-qa-db-fra.com

org.glassfish.jersey.servlet.ServletContainer ClassNotFoundException

Je reçois une exception ClassNotFoundException avec org.glassfish.jersey.servlet.ServletContainer mais cela a particulièrement commencé la nuit dernière lorsque j'ai essayé de démarrer/redémarrer mon serveur Tomcat (v7) avec Eclipse Juno.

Pas sûr de ce qui se passe. Ce qui est bizarre, c’est que cela a commencé à se produire la nuit dernière alors que cela fonctionnait parfaitement bien avant cela.

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

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

Je me suis assuré que les fichiers jar du maillot étaient toujours présents dans WEB-INF/lib:

WEB-INF/lib with jersey jars

46
ssankara73

Le problème:

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

indique que vous essayez d'utiliser la servlet Jersey 2.x , mais que vous fournissez le Jersey 1.x libs.

Pour Jersey 1.x , vous devez procéder comme suit:

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

Pour plus d'informations, consultez le documentation Jersey 1.x .

Si vous préférez utiliser Jersey 2.x , vous devrez fournir le Jersey 2.x libs. Dans un projet basé sur Maven, vous pouvez utiliser les éléments suivants:

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

Pour Jersey 2.x , vous n'avez pas besoin de configurer quoi que ce soit dans votre web.xml, il suffit de fournir une classe similaire à celle-ci:

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

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

}

Pour plus d'informations, consultez le documentation Jersey .

Voir aussi:

85
unwichtich

C'est un problème d'installation Eclipse, pas un problème Jersey.

A partir de cette discussion ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Cliquez avec le bouton droit de la souris sur les propriétés de votre projet Eclipse -> Assemblage de déploiement -> Ajouter -> Java Entrées de chemin de construction -> Gradle Dependencies -> Terminer.

Eclipse n'utilisait donc pas les dépendances Gradle au démarrage d'Apache.

20
Adi

Si vous utilisez Jersey 2.x , utilisez la dépendance suivante:

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

XX pourrait correspondre à la version que vous recherchez. Conteneurs Jersey .

11
agpt

Je suis d'accord avec la réponse acceptée. Mais pour moi, le problème n'était pas que, je devais plutôt modifier mon nom Servlet-Class de: -

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

À:

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

Donc, enlever .class a bien fonctionné dans mon cas. J'espère que ça va aider quelqu'un!

3
Nerdy

Le code ci-dessous fonctionne pour moi dans le fichier 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>
3
Lalit Kale

Le jersey-container-servlet utilise en fait le jersey-container-servlet-core dépendance. Mais si vous utilisez Maven, cela n'a pas vraiment d'importance. Si vous définissez simplement le jersey-container-servlet _ usage, il téléchargera automatiquement la dépendance également.

Mais pour ceux qui ajoutent des fichiers jar à leur projet manuellement (c'est-à-dire sans maven), il est important de savoir que vous avez en fait besoin des deux fichiers jar. Le org.glassfish.jersey.servlet.ServletContainer La classe fait en réalité partie de la dépendance de base.

1
bvdb

Si vous n'utilisez pas maven, essayez de placer vos pots dans WEB-INF/lib, cela a fonctionné pour moi.

1
Jordi M.

J'ai eu le même problème avec Eclipse, la solution de WA était de copier les bibliothèques sur WEB-INF/lib

0
15412s

Supposons que vous utilisiez Jersey 2.25.1, cela fonctionnait pour moi. J'utilise le conteneur Web 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>

NB: Remplacer la version par la version que vous utilisez

0
Christopher Kikoti