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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.lang.ClassNotFoundException:com.sun.jersey.spi.container.servlet.ServletContainer相关的知识,希望对你有一定的参考价值。

我正在尝试使用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内。我很累,我很感激任何帮助。

答案

你已经下载了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中注册类/实例的其他信息。

另一答案

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

jersey-bundle-1.17.1.jar

另一答案

您必须在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

另一答案

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

另一答案

回到原来的问题 - 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构建和部署项目,则需要这样做。

另一答案

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

jaxrs-ri-2.2.1.zip
另一答案

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

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

另一答案

如果有人试图使用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
另一答案

它主要取决于您使用的是哪种版本的球衣。如果您使用的是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文件夹中

另一答案

如果你使用的是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>
另一答案

在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>
另一答案

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

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

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

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

另一答案

试试这个 :

org.glassfish.jersey.servlet.ServletContainer

在servlet类上

另一答案

虽然我遵循了不同的指南,但我遇到了和你一样的问题: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(原型),生成一个球衣项目,喜欢这样:

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