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

Posted

技术标签:

【中文标题】java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer【英文标题】:java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer 【发布时间】:2013-08-07 19:35:20 【问题描述】:

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

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

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

【问题讨论】:

你是如何安装 Jersey 的?我无法访问低于 2.29 版本的任何内容,并且文章谈到了 2.11? 【参考方案1】:

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

参考文献:RESTful Web Services with using Jersey

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

如果有人尝试使用 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

【讨论】:

【参考方案4】:

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

最后通过以下方法解决:将jars直接添加到tomcat/lib(NOT WEB-INF\lib)文件夹并重启tomcat。

【讨论】:

【参考方案5】:

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

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

【讨论】:

【参考方案6】:

这是 eclipse 设置问题,而不是 Jersey 问题。

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

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

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

【讨论】:

在这个问题上花了这么多时间,拯救了我的一天!【参考方案7】:

回到原来的问题——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 来构建和部署您的项目,这是必需的。

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

试试这个:

org.glassfish.jersey.servlet.ServletContainer

关于 servlet 类

【讨论】:

【参考方案10】:

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

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

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

右键project --&gt; Build Path --&gt; Java Build Path --&gt; Add Library --&gt; Server Runtime --&gt; Apache Tomcat v7.0

【讨论】:

【参考方案11】:

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

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

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

编辑

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

【讨论】:

+1。作为其他有类似问题的人的补充,阅读官方泽西用户指南会很有用:Chapter 4. Deploying a RESTful Web Service servlet-container 的新类是“org.glassfish.jersey.servlet.ServletContainer” servlet 类:org.glassfish.jersey.servlet.ServletContainer,初始化参数名称:jersey.config.server.provider.packages。 这个答案很好地解释了问题/错误的原因,但解决方案非常开放。因为,您提供的信息很少,我无法解决我的问题。 pom.xml、web.xml 和 java 文件的更多细节可以做得更好。或参考博客或文章,引导读者进入 Jersey 2.x 教程 @Siddharth 链接的文章应该展示一些解决问题的方法。如果您发现该文章中缺少某些信息,请告诉我。或者,您可以随时提供您的解决方案作为此问题的答案。【参考方案12】:

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

【讨论】:

【参考方案13】:

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

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

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/

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

【讨论】:

【参考方案14】:

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

奇怪的是,在我使用的本指南中,我不应该对版本之间的兼容性(1.x 与 2.x)有任何问题,因为按照指南您在pom.xml 上使用球衣 1.8.x在web.xml中,您指的是1.x 版本之前所说的类(com.sun.jersey.spi.container.servlet.ServletContainer)。所以我可以推断这应该可以工作。

我的猜测是因为我使用的是 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(原型),生成一个 jersey 项目,像这样:

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

它对我有用! :)

【讨论】:

【参考方案15】:

你需要将jersey-bundle-1.17.1.jar添加到项目的lib中

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

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

【讨论】:

我有同样的错误(使用 jersey-server、jersey-core、jersey-servlet 的 1.18.1 版本),但 IntelliJ Idea 创建的分解人工制品是带有类文件夹的单个 WEB-INF 文件夹里面和web.xml file.Classes文件夹只包含Hello.class【参考方案17】:

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

【讨论】:

你真的需要 unit:WidgetPU 吗?我认为可以通过删除它来简化答案。 此参数与 Jersey 无关 unit:WidgetPUpersistence/widget初始化参数>【参考方案18】:

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

【讨论】:

jersey-core 是 jersey-server 的一个依赖项,很多不需要显式添加 好吧,发生在我们身上的是我们将 jersey-server 从 1.0.2 升级到 1.11,并且“ServletContainer”类突然 AWOL。看起来它已在该版本和未来版本中移至 jersey-servlet 包参考:developer.jboss.org/thread/221647?tstart=0

以上是关于java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer的主要内容,如果未能解决你的问题,请参考以下文章