87

我正在尝试使用 Jersey + Google 应用引擎构建一个简单的 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>

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

只是为了检查是否com.sun.jersey.spi.container.servlet.ServletContainer存在于导入中, Jersey jars我尝试在 Java 中编写这个完全限定的名称并让智能感知完成名称,但之后我无法获得任何智能感知,所以我最后的猜测是在最新的 Jersey 版本中com.sun.je有一些包重新排列并且jersey已经不在里面了com.sun。我筋疲力尽,我将不胜感激任何帮助。

4

18 回答 18

158

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

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

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

编辑

在 Jersey 2 中注册资源和提供者包含有关如何在 Jersey 2 中注册类/实例的附加信息。

于 2013-08-07T09:40:02.223 回答
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>
于 2013-12-05T10:54:39.530 回答
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>
于 2013-10-31T18:24:58.093 回答
15

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

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

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

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

于 2016-08-04T18:58:45.073 回答
3

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

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

“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

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/

这两个链接都很好地说明了事情的运作方式并节省了大量时间。

于 2014-11-22T19:49:16.807 回答
3

尝试这个 :

org.glassfish.jersey.servlet.ServletContainer

在 servlet 类上

于 2014-04-01T22:04:06.283 回答
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 版本之前所说的类 ( )。所以我可以推断这应该有效。

我的猜测是因为我使用的是 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 (archetypes),生成一个 jersey 项目,如下所示:

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

它对我有用!:)

于 2014-08-27T09:41:57.853 回答
1

由于构建路径问题,我们收到此错误。您应该在构建路径中添加“服务器运行时”库。

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

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

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

于 2015-08-07T22:42:00.683 回答
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,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>

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

于 2015-01-21T22:31:07.027 回答
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>

于 2014-08-23T06:48:37.207 回答
0

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

于 2014-07-06T21:46:33.793 回答
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
于 2017-12-19T02:26:04.903 回答
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 复制到 WEB-INF/lib 文件夹(我使用过这个版本,适用于任何 2.x 版本)。将库复制到正确的文件夹使它们在运行时可用。

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

于 2015-09-17T19:14:24.347 回答
0

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

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

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

于 2018-01-05T07:56:02.163 回答
0

这些可能是您的依赖项与版本混合,并确保将这些依赖项添加到 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>

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

现在检查一次检查 Servlet 映射部分是否正确。

参考使用 Jersey 的 RESTful Web 服务

<servlet>
<servlet-name>RestServices</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.javaproficiency.jerseydemo.demo</param-value>
</init-param>

<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>RestServices</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
于 2022-01-09T12:02:08.407 回答
0

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

于 2015-09-15T12:06:00.647 回答
0

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

最后,以下解决了它:将 jars 直接添加到 tomcat/lib (NOT WEB-INF\lib) 文件夹并重新启动 tomcat。

于 2017-12-13T00:24:45.947 回答
0

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

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>
于 2017-08-31T12:05:17.127 回答