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

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

大家好,我是 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)

有几件事。首先是 ClassNotFoundExcetion 的问题。 class 在 jersey-servlet 罐子里。查看构建的 .war 文件,所有 jar 都构建到 war。因此,如果您手动部署 war 它应该可以工作。

这是我在 Eclipse 用户中经常遇到的问题。我不知道您是否在使用 Eclipse,我发现,在出现问题的情况下,Eclipse 不会将实际的 war 部署到服务器,而是创建服务器的内部实例,并且部署项目工件而不是实际的 war。在这种情况下,它不会加载罐子。

作为完整性检查,您可以添加此 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 实例。我用你的项目测试过它并且工作正常。

第二件事是依赖关系。您需要决定要使用哪个版本的 Jersey,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 尝试 运行 它,我不确定如何解决该问题。

好像是版本问题。只需将 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

所以最后我让它与 Jboss 一起工作。如果其他人面临这个问题并且不想使用码头(我在开发阶段仍然使用它)。 右键单击您的 eclipse 项目属性 -> 部署程序集 -> 添加 -> Java 构建路径条目 -> Maven 依赖项 -> 完成。 全新安装 Maven 构建。将 war 文件复制到 Jboss 独立部署文件夹。