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

问题描述 投票:78回答:17

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

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

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

eclipse google-app-engine java-ee jersey jersey-2.0
17个回答
147
投票

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

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

另请注意,从init-param开始的com.sun.jersey也不会被Jersey 2认出。

Edit

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


0
投票

你需要将project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0添加到项目的lib中

jersey-bundle-1.17.1.jar


0
投票

您必须在web.xml中替换:

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

为了这:

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

这是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将是这样的:

<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替换为您想要的版本,例如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,捆绑在<dependency> <groupId>org.glassfish.jersey.core</groupId> <artifactId>jersey-server</artifactId> <version>2.X</version> </dependency>

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

如果您使用eclipse构建和部署项目,则需要这样做。


0
投票

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

jaxrs-ri-2.2.1.zip

0
投票

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

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


0
投票

如果有人试图使用Jersey构建一个hello world应用程序,我认为最简单的方法之一就是遵循Jersey文档。

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

如果您已经在使用maven,则只需几分钟即可看到结果。

我在下面用过。

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

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文件夹中


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>

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>

10
投票

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

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

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

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


3
投票

试试这个 :

org.glassfish.jersey.servlet.ServletContainer

在servlet类上


2
投票

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

奇怪的是,在我使用的本指南中,我不应该对版本之间的兼容性(1.x对2.x)有任何问题,因为按照指南你在pom.xmlyou中使用jazxswpoiand上的jersey 1.8.x参考如1.x版之前所述的类(web.xml)。所以我可以推断这应该是有效的。

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


之后,我尝试用我的答案解决我的问题,没有帮助,我在com.sun.jersey.spi.container.servlet.ServletContainer上对pom.xmland进行了更改,错误更改为:web.xml

据说应该存在!

由于这个错误,我找到了一个“新的”解决方案:java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

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

http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

它对我有用! :)


2
投票

我也遇到过类似的问题。通过以下链接完成步骤教程解决了该问题。

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

  • 需要注意的主要事项是,应该将Jersey库正确放置在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

“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/jersey-hello-world-example/

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


1
投票

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

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

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

右键单击"java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer"


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.