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

我正在尝试使用Jersey + Google应用程序引擎构build一个简单的Hello World应用程序两天。 对于简单的AppEngine项目,我遵循这些教程,并且都可以正常工作https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

但现在我正在尝试添加泽西岛,并按照本教程http://www.vogella.com/articles/REST/article.html 。

但服务器不断给我

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

当我在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> 

我已经从这里下载了Jersey JAX-RS 2.1 RI bundle ,并按照教程中的描述在WEB-INF/lib文件夹中添加了所有jar文件。 甚至在两天之后,没有任何工作。 我在Google上search了几次,显然使用Maven的人已经以某种方式解决了这个问题,但是我没有使用Maven,也没有编写这个教程。

只是为了检查,即使com.sun.jersey.spi.container.servlet.ServletContainer存在于导入的Jersey jars我试图用Java编写这个完全合格的名字,让intellisense完成名称,但是我不能在com.sun.je之后得到任何intellisense com.sun.je所以我最后的猜测是,在最近的Jersey版本中已经有一些软件包重新排列 ,并且jersey不再在com.sun 。 我筋疲力尽,我将不胜感激任何forms的帮助。

您已经下载了Jersey 2(JAX-RS 2的RI)。 你所指的教程使用泽西1.从( 这里 )下载Jersey 1.17.1,应该足够你。

Jersey 1使用com.sun.jersey ,Jersey 2使用org.glassfish.jersey因此是例外。

另外请注意,Jersey 2也不会识别以com.sun.jersey开头的init-param

编辑

在Jersey 2注册资源和提供者包含了关于如何注册Jersey 2中的类/实例的更多信息。

如果你使用的是jersey2.x,那么你需要在web.xml中进行不同的configuration,因为servlet类是在其中改变的。 您可以使用以下configuration更新您的web.xml。

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

加上这个在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> 

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

从这个线程ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer

右键单击你的eclipse项目Properties – > Deployment Assembly – > Add – > Java Build Path Entries – > Gradle Dependencies – > Finish。

所以Eclipse在Apache启动时并没有使用Gradle依赖。

尝试这个 :

org.glassfish.jersey.servlet.ServletContainer

在servlet类上

我有同样的问题,虽然我已经按照不同的指导: http : //www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

奇怪的是,在这个指南中,我已经使用了,我不应该有版本之间的兼容性问题(1.x对2.x),因为遵循指南你使用jersey1.8.x上pom.xmlweb.xml引用一个类( com.sun.jersey.spi.container.servlet.ServletContainer ),如前所述1.x版本。 所以我可以推断这应该是工作。

我的猜测是因为我使用的JDK 1.7这个类不存在了。


之后,我试着用我之前的答案解决,没有帮助,我对pom.xmlweb.xml了更改,错误更改为: java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

这应该是存在的!

由于这个错误,我发现了一个“新的”解决scheme: http : //marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

用Maven(原型)生成一个jersey项目,喜欢这个:

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

它为我工作! 🙂

我也面临类似的问题。 通过从下面的链接通过步骤教程解决了这个问题。

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

  • 要注意的主要问题是泽西库应正确放置在TOMCAT WEB-INF / lib文件夹中。 它由上面链接中提到的Eclipse设置自动完成。 它将创build一个具有相关JAR文件的WAR文件。 否则,您将遇到ClassNotFoundexception的问题。

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

“11/23/2014 12:06 AM 130,458 jersey-client-1.9.jar

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

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

11/23/2014 12:06 AM 713,089 jersey-server-1.9.jar“4文件1,450,238字节

  • 第二个教程解释了如何创build一个生成和使用JSON输出的Web服务。

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

这两个链接都能很好地说明事情是如何运作的,并节省了大量的时间。

由于构buildpath问题,我们得到这个错误。 您应该在“构buildpath”中添加“ 服务器运行时 ”库。

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

请按照以下步骤解决找不到类的exception。

右键点击project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

今天我遇到了同样的错误,虽然我使用的是Jersey 1.x,并且在我的类path中有正确的jar。 对于那些想要跟随这封信的vogella教程,并使用1.xjar子,你需要添加泽西库到WEB-INF / lib文件夹。 这一定会解决问题。

您需要将jersey-bundle-1.17.1.jar添加到项目的lib中

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

你必须在你的web.xml中replace:

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

这是泽西2.x使用org.glassfish.jersey包而不是com.sun.jersey(这是由泽西岛1.x使用),因此例外。 请注意,一旦迁移到JAX-RS 2.0和Jersey 2.x,Jersey 2.x也不会识别以com.sun.jersey开头的init-param

如果你在任何时候使用maven,你的pom.xml就是这样的:

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

用你想要的版本replace2.X,例如2.15

一个简单的解决方法是,检查在eclipse的部署程序集中是否有依赖关系或库。如果您使用的是tomcat,可能是服务器可能没有识别出我们正在使用的库。 在这种情况下,在部署程序集中明确指定它。

回到原来的问题 – java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer

正如上面所说的,在JAX 2.x版本中,ServletContainer类已经被移动到包 – org.glassfish.jersey.servlet.ServletContainer。 相关jar是捆绑在jaxrs-ri-2.2.1.zip中的 jersey-container-servlet-core.jar

JAX RS可以在没有mvn的情况下通过手动将包含在压缩文件jaxrs-ri-2.2.1.zip (我已经使用这个版本,可以与任何2.x版本一起工作)中包含的所有jar复制到WEB-INF / lib文件夹中来制定。 将libs复制到正确的文件夹使它们在运行时可用。

如果您使用eclipse构build和部署项目,则这是必需的。

在pom.xml文件中,我们需要添加

 <dependency> <groupId>com.sun.jersey</groupId> <artifactId>jersey-core</artifactId> <version>1.8</version> </dependency>