When I deploy my rest api with jersey to a tomcat 7.0 server I get an error that has been discussed on stackoverflow quite often but I haven't been able to resolve it:
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)
Things I have checked:
Avoiding duplicate jersey versions
<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>
So, ServletContainer
is definitely imported
I notice however in the dependency hierarchy that the jersey servlet container is also imported through another library (dropwizard-core -> dropwizard-jersey -> jersey-container-servlet: 2.16
) and the versions differ (my version is 2.25.1
). But it says omitted for conflict with 2.25.1
Where is Apache Tomcat v7.0 package library
My project was originally a pure Maven project and I added the Dynamic Web Project
facet lateron. When I compare to a test project where I successfully tested a jersey rest api, I don't see the Apache Tomcat v7.0
libraries on my build path. In my test project I see
versus
WebContent/WEB-INF/lib is empty
As mentioned in this question the jersey libraries should be deployed to my WEB-INF/lib/
folder. I did Project -> Deployment Assembly -> Add -> Java Build Path Entries -> Maven Dependencies -> Finish
. But as soon as I do Project -> Maven -> Update
the step above is reset (i.e. I don't see Maven Dependencies
in the Web Deployment Assembly
anymore. Despite this is strange, in the successful test jersey project the lib
folder is also empty.
EDIT
There is something more fundamental going wrong. In the successful jersey rest api, I got the subfolder structure
- target
+---- generated-sources
+---- JerseyRestDemo-0.0.1-SNAPSHOT
+---- m2e-wtp
+---------- web-resources
+----------------- META-INF
+-----------------------maven
+---- maven-archiver
+--------- pom.properties
+---- test-classes - WebContent
+---- META-INF
+--------- MANIFEST.MF
+---- WEB-INF
+--------- lib
+----------web.xml
However, in my current project I just see
- target
+----- generated-sources
+---------- annotations
+----- maven-status
+---------- maven-compiler-plugin
+--------------- compile - WebContent
+---- META-INF
+--------- MANIFEST.MF
+---- WEB-INF
+--------- lib
+----------web.xml
Thanks for your help