ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer 是一个Java编程中可能会遇到的错误。

91

我正在尝试使用Jersey和Google应用引擎构建一个简单的Hello World应用程序,已经两天了。对于简单的AppEngine项目,我按照以下教程进行,都可以正常工作: https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

但现在我想添加Jersey,并遵循这个教程: http://www.vogella.com/articles/REST/article.html

但是当我在web.xml中添加这些行时,服务器始终会出现以下错误:

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

<?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捆绑包,并按照教程中所述将所有JAR文件添加到WEB-INF/lib文件夹中。但即使过了两天仍然无法正常工作。我已经在Google上搜索了几次,显然使用Maven的人已经解决了它,但我既不使用Maven,也没有写那篇教程的人使用它。

为了检查导入的Jersey JAR文件中是否存在com.sun.jersey.spi.container.servlet.ServletContainer,我尝试只写出这个完全合格的名称让智能感知完成名称,但在com.sun.je之后我找不到任何智能感知,因此我最后的猜测是,在最新的Jersey构建中进行了一些包重组,并且jersey不再在com.sun内部。我筋疲力尽,如果有任何帮助,我将不胜感激。


你是如何安装Jersey的?我无法访问低于2.29版本的任何内容,但文章中提到了2.11版本? - pixel
19个回答

159

您已经下载了Jersey 2(JAX-RS 2的RI)。您所参考的教程使用的是Jersey 1。从这里下载Jersey 1.17.1应该就足够了。

Jersey 1使用com.sun.jersey,而Jersey 2使用org.glassfish.jersey,因此会出现异常。

还要注意的是以com.sun.jersey开头的init-param也不会被Jersey 2识别。

编辑

在Jersey 2中注册资源和提供程序包含有关如何在Jersey 2中注册类/实例的其他信息。


2
作为其他遇到类似问题的人的补充,阅读官方的Jersey用户指南将非常有用:第4章。部署RESTful Web服务 - informatik01
6
Servlet容器的新类名为"org.glassfish.jersey.servlet.ServletContainer"。 - cljk
4
Servlet类:org.glassfish.jersey.servlet.ServletContainer,初始化参数名称:jersey.config.server.provider.packages。 - picmate 涅
1
这个答案很好地解释了问题/错误的原因,但是留下了解决方案非常开放。因为,根据你提供的少量信息,我无法解决我的问题。一些关于pom.xml、web.xml和java文件的更多细节可能会做得更好。或者引用一个指导读者进入Jersey 2.x教程的博客或文章。 - Paulo Oliveira
1
@Siddharth,这篇文章的目的是展示如何解决问题的一些方法。如果你觉得这篇文章中缺少了某些信息,请告诉我。或者,你也可以将你的解决方案作为答案提供给这个问题。 - Michal Gajdos
显示剩余5条评论

35

如果你正在使用Jersey 2.x,那么在web.xml中需要进行不同的配置,因为其中的servlet类已更改。你可以使用以下配置更新你的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>

9
你是否真的需要 unit:WidgetPU?我认为通过删除它可以简化答案。 - Nikita Bosik
1
这个参数与Jersey无关 <init-param> <param-name>unit:WidgetPU</param-name> <param-value>persistence/widget</param-value> </init-param> - vaquar khan

23

将此添加到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>

2
jersey-core 是 jersey-server 的依赖项,可能无需显式添加。 - Kalpesh Soni
好的,我们发生了什么事情是我们将jersey-server从1.0.2升级到1.11,结果"ServletContainer"类突然不见了。看起来它在那个版本和将来的版本中被移动到了jersey-servlet包中,参考:https://developer.jboss.org/thread/221647?tstart=0 - rogerdpack

15

这是一个Eclipse设置问题,而不是Jersey问题。

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

右键单击您的Eclipse项目属性-> Deployment Assembly -> 添加 -> Java构建路径条目-> Gradle依赖项-> 完成。

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


1
为了解决这个问题花费了很多时间,终于解决了! - Tushar Thakur

3

我也遇到了类似的问题。通过下面链接中的逐步教程解决了这个问题。

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

  • 需要注意的主要事项是,Jersey库应该放置在TOMCAT WEB-INF/lib文件夹中。这是由上面链接中提到的Eclipse设置自动完成的。它将创建一个带有依赖JAR文件的WAR文件。否则,您将遇到ClassNotFound异常问题。

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

  • 第二篇教程介绍了如何创建一个生成和消费JSON输出的Web服务。
"

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

这两个链接很好地解释了事情的运作方式,并且节省了大量时间。


3

试试这个:

org.glassfish.jersey.servlet.ServletContainer

在servlet-class上。


2

我之前也遇到了相同的问题,但是我是按照不同的指南操作的:http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

奇怪的是,在我使用的这个指南中,我不应该在版本(1.x对2.x)之间存在兼容性问题,因为根据指南,您在pom.xml中使用jersey 1.8.x,并且在web.xml中引用一个类(com.sun.jersey.spi.container.servlet.ServletContainer),正如上面所说的1.x版本。因此,我可以推断出这应该可以工作。

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


之后,我尝试通过之前回答中的解决方案来解决,但没有帮助,我对pom.xmlweb.xml进行了更改,错误信息变为:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

这个应该是已经存在的!

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

使用Maven(archetypes)生成一个jersey项目,像这样:

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

对我来说这很有效! :)


1
由于构建路径问题,我们会收到此错误。您应该在构建路径中添加“Server Runtime”库。
"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"

请按照以下步骤解决类未找到异常:
右键单击项目 --> 构建路径 --> Java构建路径 --> 添加库 --> 服务器运行时 --> Apache Tomcat v7.0

0

如果有人想使用Jersey构建一个Hello World应用程序,我认为最简单的方法之一是遵循Jersey文档。

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

如果您已经在使用Maven,那么只需要几分钟就可以看到结果。
我使用了以下内容。
mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26

0

你必须在你的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>

对于这个:

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

这是Jersey 2.x使用org.glassfish.jersey包而不是Jersey 1.x使用的com.sun.jersey,因此会出现异常。请注意,一旦您迁移到JAX-RS 2.0和Jersey 2.x,以com.sun.jersey开头的init-param也将不被Jersey 2.x识别。

如果您在任何时候使用maven,则您的pom.xml应该如下:

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

将2.X替换为您想要的版本,例如2.15


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接