eclipse - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
google-app-engine java-ee (17)
Intento crear una aplicación hello world sencilla durante dos días utilizando el motor de la aplicación Jersey + Google. Para el simple proyecto de App Engine, 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 seguir este tutorial http://www.vogella.com/articles/REST/article.html .
Pero el servidor me sigue dando
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 el JAX-RS 2.1 RI bundle
Jersey JAX-RS 2.1 RI bundle
desde here y he agregado todos los archivos jar en la carpeta WEB-INF/lib
como se describe en el tutorial. E incluso después de dos días, nada está funcionando. He buscado varias veces en Google y, aparentemente, las personas que están usando Maven lo han resuelto de alguna manera, pero no estoy usando Maven ni el tipo que escribió ese tutorial.
Solo para comprobar si incluso com.sun.jersey.spi.container.servlet.ServletContainer
existe en los com.sun.jersey.spi.container.servlet.ServletContainer
importados de Jersey jars
, intenté simplemente escribir este nombre totalmente calificado en Java y dejar que el intellisense terminara los nombres, pero no pude obtener ningún intellisense después de com.sun.je
así que mi última conjetura es que ha habido algún cambio en el paquete en la última versión de Jersey y jersey
ya no está dentro de com.sun
. Estoy agotado y agradecería cualquier tipo de ayuda.
Añadir 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>
Básicamente depende de qué versión jersey estés usando. Si está usando Jersey ver.1.XX, necesita agregar
Jersey 1 usa " com.sun.jersey ", y Jersey 2 usa org.glassfish . en la etiqueta de la clase servlet. Además, tenga en cuenta que también init-param que comience con com.sun.jersey no será reconocido por Jersey 2.
Y agregue todo el archivo jar a la carpeta lib de WEB-INF
Debes reemplazar en tu 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 utiliza paquetes org.glassfish.jersey en lugar de com.sun.jersey (que es usado por Jersey 1.x) y de ahí la excepción. Tenga en cuenta que también init-param que comience con com.sun.jersey no será reconocido por Jersey 2.x 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 deseada, p. ej. 2.15
El mismo error y desperdicio 2+ horas de depuración y probando todas las opciones. No estaba usando el Maven / POM, así que no pude aprovechar esa solución dada por pocos.
Finalmente lo resolvió: Agregar los archivos JAR directamente a la carpeta tomcat / lib (NO WEB-INF / lib) y reiniciar el tomcat.
En el archivo pom.xml tenemos que agregar
<dependency>
<groupId>com.sun.jersey</groupId>
<artifactId>jersey-core</artifactId>
<version>1.8</version>
</dependency>
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 su proyecto de eclipse Propiedades -> Ensamblaje de despliegue -> Agregar -> Entradas de ruta de compilación Java -> Dependencias de Gradle -> Finalizar.
Entonces Eclipse no estaba usando las dependencias de Gradle cuando Apache estaba comenzando.
Ha descargado Jersey 2 (que RI de JAX-RS 2). El tutorial al que se refiere utiliza Jersey 1. Descargue Jersey 1.17.1 desde ( here ), debería ser suficiente para usted.
Jersey 1 usa com.sun.jersey
, y Jersey 2 usa org.glassfish.jersey
ahí la excepción.
También tenga en cuenta que también init-param
comience con com.sun.jersey
no será reconocido por Jersey 2.
Editar
El registro de recursos y proveedores en Jersey 2 contiene información adicional sobre cómo registrar clases / instancias en Jersey 2.
Me encontré con el mismo error hoy, aunque estaba usando Jersey 1.x, y tenía los tarros correctos en mi classpath. Para aquellos que quieran seguir el tutorial de Vogella al pie de la letra y usar los frascos 1.x, necesitarás agregar las bibliotecas jersey a la carpeta WEB-INF / lib. Esto sin duda resolverá el problema.
Obtenemos este error debido a un problema de compilación. Debería agregar bibliotecas " Server Runtime " en Build Path.
"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"
Por favor, siga los pasos a continuación para resolver la excepción de clase no encontrada.
Haga clic derecho en el project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0
Si alguien está intentando construir una aplicación de hello world utilizando Jersey, creo que una de las maneras más fáciles es seguir la documentación de Jersey.
https://jersey.github.io/download.html
Si ya está usando maven, tomaría solo unos minutos para ver el resultado.
Usé abajo.
mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26
Si está usando jersey 2.x, entonces necesita una configuración diferente en web.xml ya que la clase de servlet es modificada. puedes actualizar tu 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>
También me enfrenté a 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 que hay que notar 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 a.m. 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 dieron una buena imagen de cómo funcionan las cosas y ahorran mucho tiempo.
Tuve el mismo problema que tú, aunque seguí una guía diferente: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/
La parte extraña es que, en esta guía que he utilizado, no debería haber ningún problema con la compatibilidad entre las versiones (1.x contra 2.x) porque siguiendo la guía utilizas el jersey 1.8.x en pom.xml
y en el web.xml
se refiere a 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 las mías, no me ayudó, hice cambios en el pom.xml
y en el web.xml
el error cambió a: java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
¡Lo cual supuestamente debería existir!
Como resultado de este error, encontré una solución "nueva": http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/
Con Maven (arquetipos), generar 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í! :)
Una solución simple es verificar si tiene dependencias o libs en el ensamblado de implementación de eclipse. Probablemente si está usando tomcat, el servidor podría no haber identificado las librerías que estamos utilizando. en ese caso, especifíquelo explícitamente en el ensamblaje de implementación.
Volviendo al problema original: java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
Como se dijo anteriormente, en la versión JAX 2.x, la clase ServletContainer se ha movido al paquete - org.glassfish.jersey.servlet.ServletContainer. El contenedor relacionado es jersey-container-servlet-core.jar que se incluye dentro del jaxrs-ri-2.2.1.zip
JAX RS se puede resolver sin mvn copiando manualmente todos los archivos incluidos en el archivo zip jaxrs-ri-2.2.1.zip (he utilizado esta versión, funcionaría con cualquier versión 2.x) en la carpeta WEB-INF / lib. Copiar libs a la carpeta derecha los hace disponibles en tiempo de ejecución.
Esto es obligatorio si está utilizando eclipse para compilar e implementar su proyecto.
necesitas agregar jersey-bundle-1.17.1.jar
a lib 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>
prueba esto :
org.glassfish.jersey.servlet.ServletContainer
en servlet-class