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

时间:2015-10-25 06:51:41

标签: rest maven servlets jersey jersey-1.0

嗨,大家好,我是maven和webapps的新手,所以请耐心等待。 我已经完成了大多数堆栈溢出的解决方案 java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

但我仍无法解决此问题。 我正在使用jersey lib版本1.18.1 我成功地导入了com.sun.jersey.spi.container.servlet.ServletContainer(试图确保它在构建路径的范围内)

我已将我的示例项目发布到git https://github.com/varuntewari/Restful-API 你能帮我解决一下这个问题吗?

java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1854)
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1703)
    at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:506)
    at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:488)
    at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:115)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1148)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1087)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5253)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5543)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1574)
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1564)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

3 个答案:

答案 0 :(得分:2)

所以有几件事情。首先是ClassNotFoundExcetion的问题。该类位于jersey-servlet jar中。查看构建的.war文件,所有的jar都是为了战争而构建的。因此,如果您手动部署战争,它应该工作。

这是我在Eclipse用户中看到很多问题。我不知道你是否在使用Eclipse,我已经弄清楚的是,在问题的情况下,Eclipse并没有将实际的战争部署到服务器,而是创建了服务器的内部实例,部署项目工件而不是实际的战争。在这种情况下,它不会加载罐子。

作为完整性检查,您可以添加此jetty-maven-plugin。我一直用它来进行开发

<plugins>
    <plugin>
        <groupId>org.eclipse.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>9.2.6.v20141205</version>
    </plugin>
    ...
</plugins>

然后从命令行运行mvn jetty:run。这会将您的应用部署到由Maven创建的嵌入式Jetty实例。我测试了你的项目并且工作正常。

第二件事是依赖。您需要确定要用户的泽西岛版本,1.x版本或2.x版本。无论你选择哪种,你都应该摆脱所有其他版本的工件。

对于您当前的项目,假设您要使用Jersey 1.x,您应该在当前项目中摆脱这两个。

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>2.0</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-client</artifactId>
    <version>2.0</version>
</dependency>

删除这两个并使用Jetty插件运行应该可以正常工作。至于尝试从IDE运行它,我不知道如何解决这个问题。

答案 1 :(得分:1)

所以最后我让它与Jboss合作。如果其他人正面临这个问题并且不想使用码头(我仍然在开发阶段使用它)。 右键单击您的eclipse项目Properties - &gt;部署组件 - &gt;添加 - &gt; Java构建路径条目 - &gt; Maven依赖关系 - &gt;完。 清洁安装maven构建。将war文件复制到Jboss独立部署文件夹。

答案 2 :(得分:0)

似乎有版本问题。只需将pom中使用的asm版本从3.3.1更改为3.1即可。

<dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.1</version>
</dependency>

而不是

<dependency>
        <groupId>asm</groupId>
        <artifactId>asm</artifactId>
        <version>3.3.1</version>
</dependency>

Output of code