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


85

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

但是现在我试图添加Jersey并遵循本教程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>

JAX-RS 2.1 RI bundle这里下载了Jersey ,并WEB-INF/lib按照教程中的说明将所有jar文件添加到了文件夹中。即使经过两天,也没有任何效果。我已经在Google上搜索过几次,显然使用Maven的人已经以某种方式解决了它,但是我没有使用Maven,编写该教程的人也没有。

只是为了检查com.sun.jersey.spi.container.servlet.ServletContainer导入中是否存在, Jersey jars我试图用Java编写这个完全限定的名称,并让intellisense完成名称,但是之后我却没有得到任何intellisense,com.sun.je所以我的最后猜测是在最新的Jersey版本中进行了一些软件包重新排列jersey不再是内部的com.sun。我筋疲力尽,我将不胜感激。


您是如何安装球衣的?我无法访问版本2.29以下的任何内容,并且文章讨论了2.11?
像素

Answers:


154

您已经下载了Jersey 2(JAX-RS 2的RI)。您所指的教程使用Jersey1。从(here)下载Jersey 1.17.1应该足够了。

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

另请注意,init-paramcom.sun.jersey2开始也不会识别以开头。

编辑

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


2
+1。作为其他有类似问题的用户的补充,阅读泽西岛官方用户指南:第4章。部署RESTful Web服务
informatik01

6
servlet容器的新类是“ org.glassfish.jersey.servlet.ServletContainer”
cljk 2014年

4
Servlet类:org.glassfish.jersey.servlet.ServletContainer,初始化参数名称:jersey.config.server.provider.packages。
涅涅pic野餐友

1
这个答案很好地说明了问题/错误的原因,但是却使解决方案变得非常开放。因为,您所提供的信息很少,所以我无法解决问题。有关pom.xml,web.xml和java文件的更多详细信息可能会做得更好。或者参考博客或文章,指导读者进入泽西岛2.x的教程
Paulo Oliveira 2014年

1
链接的文章@Siddharth应该显示一些解决问题的方法。如果您发现该文章中缺少一些信息,请告诉我。或者,您始终可以提供您的解决方案作为对此问题的答案。
Michal Gajdos

34

如果您使用的是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

22

在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 2015年

好吧,发生在我们身上的是我们将jersey-server从1.0.2升级到1.11,“ ServletContainer”类突然变为AWOL。看起来它在该版本和将来的版本中已移至jersey-servlet软件包参考:developer.jboss.org/thread/221647?
tstart=

15

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

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

右键单击Eclipse项目的属性->部署程序集->添加-> Java构建路径条目-> Gradle依赖项->完成。

因此,Apache启动时Eclipse并未使用Gradle依赖项。


1
花了这么多时间解决这个问题,节省了我的时间!
Tushar Thakur

3

试试这个 :

org.glassfish.jersey.servlet.ServletContainer

在servlet类上


2

尽管遵循了不同的指南,但我也遇到了与您相同的问题:http : //www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

奇怪的是,在我使用的本指南中,版本之间的兼容性(1.x对2.x)应该不会有任何问题,因为按照该指南,您使用泽西岛1.8.x,pom.xmlweb.xml您所指的是com.sun.jersey.spi.container.servlet.ServletContainer1.x版本之前所说的class()。因此,我可以推断这应该可行。

我的猜测是因为我使用的是JDK 1.7,所以该类不再存在。


之后,我尝试用我的答案解决问题,但没有帮助,我对pom.xml和进行了web.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(原型),生成一个球衣项目,如下所示:

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

它为我工作!:)


2

我也面临类似的问题。通过以下链接中的逐步教程解决了该问题。

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

  • 要注意的主要事情是,球衣库应正确放置在TOMCAT WEB-INF / lib文件夹中。它是通过上面链接中提到的Eclipse设置自动完成的。它将使用相关的JAR文件创建一个WAR文件。否则,您将遇到ClassNotFound Exception问题。

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

“ 2014年11月23日12:06 130,458 jersey-client-1.9.jar

2014年11月23日12:06 458,739 jersey-core-1.9.jar

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

2014年11月23日12:06 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/

这两个链接都很好地说明了工作原理并节省了大量时间。


1

由于构建路径问题,我们收到此错误。您应该在构建路径中添加“ Server Runtime ”库。

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

请按照以下步骤解决未找到类的异常。

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


0

尽管我使用的是Jersey 1.x,但我今天遇到了同样的错误,并且在我的类路径中有正确的jar。对于那些想按照字母顺序学习vogella教程并使用1.x jars的人,您需要将jersey库添加到WEB-INF / lib文件夹中。这肯定会解决问题。


我有相同的错误(使用1.18.1版本的jersey-server,jersey-core,jersey-servlet),但是IntelliJ Idea创建的爆炸伪像是单个WEB-INF文件夹,其中包含classes文件夹和web.xml文件。文件夹仅包含Hello.class
skiabox,2014年

0

您需要添加jersey-bundle-1.17.1.jar到项目库

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


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软件包而不是com.sun.jersey软件包(Jersey 1.x使用的),因此是个例外。请注意,一旦迁移到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


0

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


0

回到最初的问题-java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer

正确地说,在JAX 2.x版本中,ServletContainer类已移至包org.glassfish.jersey.servlet.ServletContainer。相关的jar是jersey-container-servlet-core.jar,它捆绑在jaxrs-ri-2.2.1.zip中。

通过手动复制zip文件jaxrs-ri-2.2.1.zip中包含的所有jar,可以在没有mvn的情况下解决JAX RS问题。(我使用过该版本,可以使用任何2.x版本)中到WEB-INF / lib文件夹中,。将库复制到正确的文件夹可以使它们在运行时可用。

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


0

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

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

0

相同的错误,浪费了超过2个小时的调试和尝试所有选项的时间。我没有使用Maven / POM,因此无法利用少数人提供的解决方案。

最后,以下内容解决了该问题:将jar直接添加到tomcat / lib(NOT WEB-INF \ lib)文件夹中,然后重新启动tomcat。


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

这基本上取决于您使用的球衣版本。如果您使用的是Jersey ver.1.XX,则需要添加

球衣1使用“ com.sun.jersey ”,球衣2使用org.glassfish。在servlet类标签上。另外,请注意,以com.sun.jersey开头的init-param也不会被Jersey 2识别。

并将所有的jar文件添加到WEB-INF lib文件夹中

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.