jersey - ClassNotFoundException org.glassfish.jersey.servlet.ServletContainer

时间:2017-12-05 09:28:45

标签: java rest maven tomcat servlets

当我将带有jersey的rest api部署到tomcat 7.0服务器时,我得到一个错误,这个错误已经经常在stackoverflow上讨论过,但我还没能解决它:

java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892)
at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735)
at org.apache.catalina.core.DefaultInstanceManager.loadClass(DefaultInstanceManager.java:495)
at org.apache.catalina.core.DefaultInstanceManager.loadClassMaybePrivileged(DefaultInstanceManager.java:477)
at org.apache.catalina.core.DefaultInstanceManager.newInstance(DefaultInstanceManager.java:113)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1133)
at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072)
at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5362)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1700)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1690)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

我检查过的事情:

避免重复的球衣版本

<dependency>
    <groupId>org.glassfish.jersey.containers</groupId>
    <artifactId>jersey-container-servlet</artifactId>
    <version>${jersey2.version}</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-json-jackson</artifactId>
    <version>${jersey2.version}</version>
</dependency>
<dependency>
    <groupId>javax.ws.rs</groupId>
    <artifactId>javax.ws.rs-api</artifactId>
    <version>2.1</version>
</dependency>

所以,ServletContainer肯定是导入的

ServletContainer.class in Maven dependencies

但是我注意到在依赖关系层次结构中,jersey servlet容器也是通过另一个库(dropwizard-core -> dropwizard-jersey -> jersey-container-servlet: 2.16)导入的,版本不同(我的版本是2.25.1)。但它说omitted for conflict with 2.25.1

jersey servlet container of different version also imported by different lib

Apache Tomcat v7.0软件包库在哪里

我的项目最初是纯Maven项目,后来我添加了Dynamic Web Project方面。当我与我成功测试了泽西休息api的测试项目进行比较时,我在构建路径上看不到Apache Tomcat v7.0个库。在我的测试项目中,我看到了

build path of successful rest api project

build path of actual project

WebContent / WEB-INF / lib为空

this question中所述,应将泽西图书馆部署到我的WEB-INF/lib/文件夹中。我做了Project -> Deployment Assembly -> Add -> Java Build Path Entries -> Maven Dependencies -> Finish。但是一旦Project -> Maven -> Update,我就会重置上面的步骤(即我不再在Maven Dependencies中看到Web Deployment Assembly。尽管这很奇怪,但在成功的测试球衣项目中lib文件夹也是空的。

修改

有一些更根本的错误。在成功的球衣休息api中,我得到了子文件夹结构

  • 目标
    + ----生成来源
    + ---- JerseyRestDemo-0.0.1-SNAPSHOT
    + ---- m2e-wtp
    + ----------网络资源
    + ----------------- META-INF
    + -----------------------行家
    + ---- maven-archiver
    + --------- pom.properties
    + ---- test-classes
  • 的WebContent
    + ---- META-INF
    + --------- MANIFEST.MF
    + ---- WEB-INF
    + --------- lib
    + ----------的web.xml

但是,在我目前的项目中,我只看到

  • 目标
    + -----生成来源
    + ----------注释
    + ----- maven-status
    + ---------- maven-compiler-plugin
    + ---------------编译
  • 的WebContent
    + ---- META-INF
    + --------- MANIFEST.MF
    + ---- WEB-INF
    + --------- lib
    + ----------的web.xml

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我在this post之后将项目从maven再次转换为webapp,然后就可以了