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

时间:2013-08-06 17:02:13

标签: eclipse google-app-engine java-ee jersey jersey-2.0

我正在尝试使用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

但是服务器一直在给我

  

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>

我已从here下载了泽西JAX-RS 2.1 RI bundle,并已在WEB-INF/lib文件夹中添加了所有jar文件,如教程中所述。即使两天后也没有任何效果。我已经在Google上搜索了几次,显然使用Maven的人已经解决了它,但我没有使用Maven也没有写过那个教程的人。

只是为了检查导入的com.sun.jersey.spi.container.servlet.ServletContainer中是否存在Jersey jars我试图在Java中编写这个完全限定的名称并让intellisense完成名称,但在{{1}之后我无法获得任何智能感知所以我最后的猜测是,在最新的Jersey版本中有一些包重新排列com.sun.je不再在jersey内。我很累,我很感激任何帮助。

17 个答案:

答案 0 :(得分:147)

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

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

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

修改

Registering Resources and Providers in Jersey 2包含有关如何在Jersey 2中注册类/实例的其他信息。

答案 1 :(得分:29)

如果你正在使用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>

答案 2 :(得分: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>

答案 3 :(得分:10)

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

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

右键单击您的eclipse项目Properties - &gt;部署组件 - &gt;添加 - &gt; Java构建路径条目 - &gt; Gradle Dependencies - &gt;完成。

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

答案 4 :(得分:3)

试试这个:

  

org.glassfish.jersey.servlet.ServletContainer

在servlet-class

答案 5 :(得分:2)

虽然我遵循了不同的指南,但我遇到了同样的问题:http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

奇怪的是,在我使用的本指南中,我不应该对版本之间的兼容性(1.x与2.x)有任何问题,因为按照指南使用{{1上的jersey 1.8.x并且在pom.xml中你引用了一个类(web.xml),就像1.x版之前所说的那样。所以我可以推断这应该有效。

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


之后,我尝试在我之前解决了答案,没有帮助,我已对com.sun.jersey.spi.container.servlet.ServletContainerpom.xml上的更改更改为:web.xml

据说应该存在!

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

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

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

它对我有用! :)

答案 6 :(得分: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 - - 窗口64 \ apache的 -Tomcat-7.0.56 \ web应用\ 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/

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

答案 7 :(得分:1)

由于构建路径问题,我们收到此错误。您应该在Build Path中添加“ 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

答案 8 :(得分:0)

这主要取决于您使用的是哪种版本的球衣。如果您使用的是Jersey ver.1.X.X,则需要添加

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

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

答案 9 :(得分: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

答案 10 :(得分:0)

同样的错误,浪费了2个多小时的调试和尝试所有选项。我没有使用Maven / POM,所以我无法利用少数人给出的解决方案。

最后,下面解决了这个问题:将jar直接添加到tomcat / lib (不是WEB-INF \ lib)文件夹并重新启动tomcat。

答案 11 :(得分:0)

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

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

答案 12 :(得分: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

JAX RS可以在没有mvn的情况下通过手动复制zip文件jaxrs-ri-2.2.1.zip中包含的所有jar(我已经使用过这个版本,适用于任何2.x版本)到WEB-INF / lib文件夹来解决。将libs复制到右侧文件夹使它们在运行时可用。

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

答案 13 :(得分:0)

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

答案 14 :(得分: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,泽西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>

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

答案 15 :(得分: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>

答案 16 :(得分:0)

我今天遇到了同样的错误,虽然我使用的是Jersey 1.x,并且在我的类路径中有正确的jar。对于那些想要遵循vogella教程并使用1.x罐子的人,您需要将球衣库添加到WEB-INF / lib文件夹中。这肯定会解决问题。