java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

86

Estoy tratando de crear una aplicación simple de hola mundo durante dos días utilizando el motor de aplicaciones Jersey + Google. Para un proyecto simple de AppEngine, seguí estos tutoriales y ambos funcionan bien https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

Pero ahora estoy tratando de agregar Jersey y siguiendo este tutorial http://www.vogella.com/articles/REST/article.html .

Pero el servidor sigue dándome

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

cuando agrego estas líneas en web.xml :

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<display-name>TestServer</display-name>
<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>com.test.myproject</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>
</web-app>

He descargado Jersey JAX-RS 2.1 RI bundledesde aquí y he agregado todos los archivos jar en la WEB-INF/libcarpeta como se describe en el tutorial. E incluso después de dos días, nada funciona. He buscado varias veces en Google y aparentemente las personas que están usando Maven lo han resuelto de alguna manera, pero yo no estoy usando Maven ni tampoco el tipo que escribió ese tutorial.

Solo para verificar si incluso com.sun.jersey.spi.container.servlet.ServletContainerexiste en importado Jersey jars, intenté escribir este nombre completamente calificado en Java y dejar que el intellisense termine los nombres, pero no pude obtener ningún intellisense después, com.sun.jepor lo que mi última suposición es que ha habido una reorganización del paquete en la última compilación de Jersey y jerseyya no está adentro com.sun. Estoy agotado y agradecería cualquier tipo de ayuda.

M-WaJeEh
fuente
¿Cómo se instaló la Jersey? ¿No puedo acceder a nada por debajo de la versión 2.29 y el artículo habla sobre 2.11?
píxel

Respuestas:

155

Ha descargado Jersey 2 (que RI de JAX-RS 2). El tutorial al que te refieres usa Jersey 1. Descarga Jersey 1.17.1 desde ( aquí ), debería ser suficiente para ti.

Jersey 1 utiliza com.sun.jersey, y Jersey 2 utiliza, por org.glassfish.jerseytanto, la excepción.

También tenga en cuenta que Jersey 2 no reconocerá también init-paramcomenzar con com.sun.jersey.

Editar

Registro de recursos y proveedores en Jersey 2 contiene información adicional sobre cómo registrar clases / instancias en Jersey 2.

Michal Gajdos
fuente
2
+1. Como complemento para otros con problemas similares, será útil leer la Guía del usuario oficial de Jersey: Capítulo 4. Implementación de un servicio web RESTful
informatik01
6
nueva clase para servlet-container es "org.glassfish.jersey.servlet.ServletContainer"
cljk
4
clase-servlet: org.glassfish.jersey.servlet.ServletContainer, init-param-name: jersey.config.server.provider.packages.
picmate 涅
1
Esta respuesta explica bien el motivo del problema / error, pero deja la solución muy abierta. Porque con la poca información que me diste no pude resolver mi problema. Algunos detalles más sobre los archivos pom.xml, web.xml y java podrían hacer un mejor trabajo. O refiera un blog o artículo que guíe al lector a un tutorial de Jersey 2.x
Paulo Oliveira
1
@Siddharth se suponía que el artículo vinculado mostraría algunos enfoques sobre cómo resolver el problema. Si encuentra que falta alguna información en ese artículo, hágamelo saber. O siempre puede proporcionar su solución como respuesta a esta pregunta.
Michal Gajdos
34

Si está utilizando jersey 2.x, entonces necesita una configuración diferente en web.xml ya que la clase de servlet está cambiando. puede actualizar su web.xml con la siguiente configuración.

    <servlet>
    <servlet-name>myrest</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>    
    <init-param>
      <param-name>jersey.config.server.provider.packages</param-name>
      <param-value>your.package.path</param-value>
    </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>myrest</servlet-name>
    <url-pattern>/rest/*</url-pattern>
  </servlet-mapping>
p27
fuente
9
¿Realmente necesitas la unidad: WidgetPU ? Creo que la respuesta podría simplificarse eliminándola.
Nikita Bosik
1
Este parámetro no está relacionado con Jersey <init-param> <param-name> unit: WidgetPU </param-name> <param-value> persistence / widget </param-value> </init-param>
vaquar khan
22

Agrega esto en pom

<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>
usuario1249655
fuente
2
jersey-core es una dependencia de jersey-server y no es necesario agregar muchos de forma explícita
Kalpesh Soni
OK, lo que nos pasó es que cambiamos jersey-server de 1.0.2 a 1.11 y la clase "ServletContainer" se ausentó de repente. Parece que se movió en esa y las versiones futuras al paquete jersey-servlet ref: developer.jboss.org/thread/221647?tstart=0
rogerdpack
15

Es un problema de configuración de eclipse, no un problema de Jersey.

De este hilo ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Haga clic con el botón derecho en Propiedades de su proyecto de eclipse -> Ensamblaje de implementación -> Agregar -> Entradas de ruta de compilación Java -> Dependencias de Gradle -> Finalizar.

Entonces, Eclipse no estaba usando las dependencias de Gradle cuando Apache se estaba iniciando.

Adi
fuente
1
Pasé tanto tiempo para este problema, ¡me salvó el día!
Tushar Thakur
3

prueba esto :

org.glassfish.jersey.servlet.ServletContainer

en clase de servlet

Pichitron
fuente
2

Tuve el mismo problema que tú, aunque he seguido una guía diferente: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

Lo extraño es que, en esta guía que he usado, no debería tener ningún problema con la compatibilidad entre versiones (1.x contra 2.x) porque siguiendo la guía usas la camiseta 1.8.xy pom.xmlen la que web.xmlte refieres una clase ( com.sun.jersey.spi.container.servlet.ServletContainer) como se dijo antes de la versión 1.x. Entonces, como puedo inferir, esto debería estar funcionando.

Supongo que porque estoy usando JDK 1.7, esta clase ya no existe.


Después, traté de resolver con las respuestas antes que la mía, no ayudó, hice cambios en pom.xmly en web.xmlel error cambió a:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

¡Que supuestamente debería existir!

Como resultado de este error, encontré una "nueva" solución: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

Con Maven (arquetipos), genere un proyecto de jersey, le gusta esto:

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.0

¡Y funcionó para mí! :)

Paulo Oliveira
fuente
2

También enfrenté un problema similar. Resolvió el problema siguiendo el tutorial paso a paso del siguiente enlace.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/

  • Lo principal a tener en cuenta es que las bibliotecas de jersey deben colocarse correctamente en la carpeta TOMCAT WEB-INF / lib. Se realiza automáticamente mediante la configuración de Eclipse mencionada en el enlace anterior. Creará un archivo WAR con los archivos JAR dependientes. De lo contrario, se encontrará con problemas con ClassNotFound Exception.

apache-tomcat-7.0.56-windows-x64 \ apache -tomcat-7.0.56 \ webapps \ JerseyJSONExample \ WEB-INF \ lib

"23/11/2014 12:06 a. M. 130,458 jersey-client-1.9.jar

23/11/2014 12:06 AM 458,739 jersey-core-1.9.jar

23/11/2014 12:06 a.m. 147,952 jersey-json-1.9.jar

23/11/2014 12:06 AM 713,089 jersey-server-1.9.jar "4 Archivo (s) 1,450,238 bytes

  • El segundo tutorial explica cómo crear un servicio web que produce y consume salida JSON.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

Ambos enlaces ofrecen una buena imagen de cómo funcionan las cosas y ahorran mucho tiempo.

yogishaj
fuente
1

Recibimos este error debido a un problema de ruta de compilación. Debe agregar bibliotecas " Server Runtime " en Build Path.

"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"

Siga los pasos a continuación para resolver la excepción de clase no encontrada.

Clic derecho en project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

Sachin GN
fuente
0

Hoy encontré el mismo error aunque estaba usando Jersey 1.xy tenía los frascos correctos en mi classpath. Para aquellos que deseen seguir el tutorial de vogella al pie de la letra y usar los frascos 1.x, deberán agregar las bibliotecas de jersey a la carpeta WEB-INF / lib. Sin duda, esto resolverá el problema.

Rickygrimes
fuente
Tengo el mismo error (usando la versión 1.18.1 de jersey-server, jersey-core, jersey-servlet) pero el artefacto explotado que crea IntelliJ Idea es una sola carpeta WEB-INF con carpeta de clases dentro y archivo web.xml. La carpeta contiene solo Hello.class
skiabox
0

necesitas agregar jersey-bundle-1.17.1.jara la biblioteca del proyecto

<servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <!-- <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class> --> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <!-- <param-name>jersey.config.server.provider.packages</param-name> --> <param-value>package.package.test</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet>

Ahmad R. Nazemi
fuente
0

Debe reemplazar en su web.xml:

<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>com.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

para esto:

<servlet>
    <servlet-name>Jersey REST Service</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.test.myproject</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

esto es Jersey 2.x usa paquetes org.glassfish.jersey en lugar de com.sun.jersey (que es usado por Jersey 1.x) y por lo tanto la excepción. Tenga en cuenta que también Jersey 2.x no reconocerá init-param que comience con com.sun.jersey una vez que migre a JAX-RS 2.0 y Jersey 2.x

si en algún momento usa maven, su pom.xml sería este:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.X</version>
</dependency>

reemplace 2.X por la versión que desee, por ejemplo, 2.15

Juan David Grisales Garzón
fuente
0

Una solución alternativa simple es verificar si tiene dependencias o bibliotecas en el ensamblaje de implementación de eclipse. Probablemente, si está usando tomcat, es posible que el servidor no haya identificado las bibliotecas que estamos usando. en ese caso, especifíquelo explícitamente en el ensamblaje de implementación.

brillar
fuente
0

Volviendo al problema original: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Como se dijo correctamente anteriormente, en la versión JAX 2.x, la clase ServletContainer se ha movido al paquete: org.glassfish.jersey.servlet.ServletContainer. El jar relacionado es jersey-container-servlet-core.jar que viene incluido dentro del jaxrs-ri-2.2.1.zip

JAX RS se puede resolver sin mvn copiando manualmente todos los frascos contenidos en el archivo zip jaxrs-ri-2.2.1.zip (he usado esta versión, funcionaría con cualquier versión 2.x) a la carpeta WEB-INF / lib. Copiar las bibliotecas en la carpeta correcta las hace disponibles en tiempo de ejecución.

Esto es necesario si está utilizando eclipse para construir e implementar su proyecto.

Andy1625
fuente
0

En el archivo pom.xml debemos agregar

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>
KARTHIKEYAN.A
fuente
0

El mismo error y perdí más de 2 horas depurando y probando todas las opciones. No estaba usando Maven / POM, por lo que no pude aprovechar esa solución dada por pocos.

Finalmente lo siguiente lo resolvió: agregar los frascos directamente a la carpeta tomcat / lib (NO WEB-INF \ lib) y reiniciar el tomcat.

Velu
fuente
0

Si alguien está intentando crear una aplicación de saludo mundial usando Jersey, creo que una de las formas más fáciles es seguir la documentación de Jersey.

https://jersey.github.io/download.html

Si ya está utilizando maven, solo le tomará unos minutos ver el resultado.

Usé a continuación.

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26
Ranga
fuente
0

Básicamente depende de la versión de jersey que estés usando. Si está utilizando Jersey ver.1.XX, debe agregar

Jersey 1 usa " com.sun.jersey " y Jersey 2 usa org.glassfish . en la etiqueta de clase de servlet. Además, tenga en cuenta que Jersey 2 no reconocerá también init-param que comience con com.sun.jersey.

Y agregue todo el archivo jar en la carpeta lib de WEB-INF

Arun
fuente