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

19

91

I am trying to build a simple hello world application for two days using Jersey + Google app engine. For simple AppEngine project I followed these tutorials and both works just fine https://developers.google.com/appengine/docs/java/gettingstarted/creating https://developers.google.com/appengine/docs/java/webtoolsplatform

But now I am trying to add Jersey and following this tutorial http://www.vogella.com/articles/REST/article.html.

But server keeps giving me

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

when I add these lines in 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>

I have downloaded Jersey JAX-RS 2.1 RI bundle from here and have added all jar files in WEB-INF/lib folder as described in tutorial. And even after two days nothing is working. I have searched several times on Google and apparently people who are using Maven have solved it somehow but I am not using Maven neither did the guy who wrote that tutorial.

Just to check if even com.sun.jersey.spi.container.servlet.ServletContainer exists in imported Jersey jars I tried to just write this fully qualified name in Java and let the intellisense finish names but I couldn't get any intellisense after com.sun.je so my last guess is that there have been some package rearrangement in latest Jersey build and jersey is no longer inside com.sun. I am exhausted and I would appreciate any kind of help.

Demagnetize answered 6/8, 2013 at 17:2 Comment(1)
How did you get the Jersey installed? I am unable to access anything below version 2.29 and article talks about 2.11?Wickham
C
159

You have downloaded Jersey 2 (which RI of JAX-RS 2). The tutorial you're referring to uses Jersey 1. Download Jersey 1.17.1 from (here), should be sufficient for you.

Jersey 1 uses com.sun.jersey, and Jersey 2 uses org.glassfish.jersey hence the exception.

Also note that also init-param starting with com.sun.jersey won't be recognized by Jersey 2.

Edit

Registering Resources and Providers in Jersey 2 contains additional info on how to register classes/instances in Jersey 2.

Calamitous answered 7/8, 2013 at 9:40 Comment(10)
Michal is right in his answer. Check out this article for the exact package name and another 2.x change that might be helpful. java.net/projects/jersey/lists/users/archive/2013-06/message/91Triangular
+1. As an addition for others with similar problems, it will be useful to read the official Jersey User Guide: Chapter 4. Deploying a RESTful Web ServiceClown
new class for servlet-container is "org.glassfish.jersey.servlet.ServletContainer"Dactylography
servlet-class: org.glassfish.jersey.servlet.ServletContainer, init-param-name: jersey.config.server.provider.packages.Dispread
This answer explains well the reason for the problem/error, but leaves the solution very open. Because, with the little information you gave I could not resolve my problem. Some more details on the pom.xml, web.xml and java files could do a better job. Or refer a blog or article that guides the reader into a tutorial for Jersey 2.xSpotted
this is not a good answer since it does not help solve hte issue, frankly i dont care about the root cause, i just need the fix i have less time as a developer, and like to know the root cause, but care only about the solutionBlabber
@Blabber the linked article was supposed to show some approaches how to solve it the problem. If you find some information missing in that article, let me know. Or you can always provide your solution as an answer to this question.Calamitous
I find your answer impossible to read and understand, you are cross referencing too much information useless for readers (in words). Also the .x is completely useless in the answer. I have tried to simplify it, I hope you find it more readable.Blabber
i have been trying to run a simple REST program for the last 4 hours and keep getting errors.But,this solution saved me .Thank you :) Stackoverflow you rock !!Secrete
this Q&A must be title/header/mainpage of jersey website.Prakrit
R
35

If you are using jersey 2.x then you need different configuration in web.xml as servlet class is change in it. you can update your web.xml with following configuration.

    <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>
Regnal answered 5/12, 2013 at 10:54 Comment(2)
Do you actually need unit:WidgetPU? I think the answer could be simplified by removing it.Convolute
This param is not related to Jersey <init-param> <param-name>unit:WidgetPU</param-name> <param-value>persistence/widget</param-value> </init-param>Arguello
S
23

Add this in 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>
Soakage answered 31/10, 2013 at 18:24 Comment(2)
jersey-core is a dependency of jersey-server and many not be needed to add explicitelyLast
OK what happened to us is we bumped jersey-server from 1.0.2 to 1.11 and "ServletContainer" class is suddenly AWOL. Looks like it was moved in that and future versions to jersey-servlet package ref: developer.jboss.org/thread/221647?tstart=0Hultgren
C
15

It's an eclipse setup issue, not a Jersey issue.

From this thread ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

Right click your eclipse project Properties -> Deployment Assembly -> Add -> Java Build Path Entries -> Gradle Dependencies -> Finish.

So Eclipse wasn't using the Gradle dependencies when Apache was starting .

Chick answered 4/8, 2016 at 18:58 Comment(1)
Spent so much time for this issue, saved my day!Liscomb
E
3

try this :

org.glassfish.jersey.servlet.ServletContainer

on servlet-class

Everyone answered 1/4, 2014 at 22:4 Comment(0)
S
3

I also faced a similar issue. Resolved the problem by going through the step step tutorial from the below link.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/jersey-hello-world-example/

  • The main thing to notice is that the jersey libraries should be placed correctly in TOMCAT WEB-INF/lib folder. It is done automatically by the Eclipse settings mentioned in the above link. It will create a WAR file with the dependent JAR Files. Else, you will run into problems with ClassNotFound Exception.

apache-tomcat-7.0.56-windows-x64\apache -tomcat-7.0.56\webapps\JerseyJSONExample\WEB-INF\lib

"11/23/2014 12:06 AM 130,458 jersey-client-1.9.jar

11/23/2014 12:06 AM 458,739 jersey-core-1.9.jar

11/23/2014 12:06 AM 147,952 jersey-json-1.9.jar

11/23/2014 12:06 AM 713,089 jersey-server-1.9.jar" 4 File(s) 1,450,238 bytes

  • The second tutorial explains about how to create a Webservice which produces and consumes JSON output.

http://examples.javacodegeeks.com/enterprise-java/rest/jersey/json-example-with-jersey-jackson/

Both the links gave a good picture on how things work and save a lot of time.

Sunderance answered 22/11, 2014 at 19:49 Comment(0)
S
2

I had the same problem as you though I have followed a different guide: http://www.mkyong.com/webservices/jax-rs/jersey-hello-world-example/

The strange part is that, in this guide I have used, I should not have any problem with compatibility between versions (1.x against 2.x) because following the guide you use the jersey 1.8.x on pom.xmland in the web.xmlyou refer to a class (com.sun.jersey.spi.container.servlet.ServletContainer) as said before of 1.x version. So as I can infer this should be working.

My guess is because I'm using JDK 1.7 this class does not exist anymore.


After, I tried to resolve with the answers before mine, did not helped, I have made changes on the pom.xmland on the web.xml the error changed to: java.lang.ClassNotFoundException: org.glassfish.jersey.servlet.ServletContainer

Which supposedly should be exist!

As result of this error, I found a "new" solution: http://marek.potociar.net/2013/06/13/jax-rs-2-0-and-jersey-2-0-released/

With Maven (archetypes), generate a jersey project, likes this:

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.0

And it worked for me! :)

Spotted answered 27/8, 2014 at 9:41 Comment(0)
V
1

We get this error because of build path issue. You should add "Server Runtime" libraries in Build Path.

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

Please follow below steps to resolve class not found exception.

Right click on project --> Build Path --> Java Build Path --> Add Library --> Server Runtime --> Apache Tomcat v7.0

Visitor answered 7/8, 2015 at 22:42 Comment(0)
K
0

I encountered the same error today although I was using Jersey 1.x, and had the right jars in my classpath. For those who'd like to follow the vogella tutorial to the letter, and use the 1.x jars, you'd need to add the jersey libraries to WEB-INF/lib folder. This will certainly resolve the problem.

Kovar answered 6/7, 2014 at 21:46 Comment(1)
I have the same error (using 1.18.1 version of jersey-server,jersey-core,jersey-servlet) but the exploded artefact that IntelliJ Idea creates is a single WEB-INF folder with classes folder inside and web.xml file.Classes folder contains only the Hello.classCandlemaker
N
0

you need to add jersey-bundle-1.17.1.jar to lib of project

<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>

Natatorial answered 23/8, 2014 at 6:48 Comment(0)
C
0

You must replace in your web.xml:

<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>

for this:

<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>

this is Jersey 2.x uses org.glassfish.jersey packages instead of com.sun.jersey (which is used by Jersey 1.x) and hence the exception. Note that also init-param starting with com.sun.jersey won't be recognized by Jersey 2.x once you migrate to JAX-RS 2.0 and Jersey 2.x

if at any moment you use maven, your pom.xml would be this:

<dependency>
    <groupId>org.glassfish.jersey.core</groupId>
    <artifactId>jersey-server</artifactId>
    <version>2.X</version>
</dependency>

replace 2.X for your desire version, e.g. 2.15

Carrero answered 21/1, 2015 at 22:31 Comment(0)
E
0

A simple workaround is , check whether you have dependencies or libs in deployment assembly of eclipse.probably if you are using tomcat , the server might not have identified the libs we are using . in that case specify it explicitly in deployment assembly.

Est answered 15/9, 2015 at 12:6 Comment(0)
C
0

Coming back to the original problem - java.lang.ClassNotFoundException: com.sun.jersey.spi.container.servlet.ServletContainer

As rightly said above, in JAX 2.x version, the ServletContainer class has been moved to the package - org.glassfish.jersey.servlet.ServletContainer. The related jar is jersey-container-servlet-core.jar which comes bundled within the jaxrs-ri-2.2.1.zip

JAX RS can be worked out without mvn by manually copying all jars contained within zip file jaxrs-ri-2.2.1.zip (i have used this version, would work with any 2.x version) to WEB-INF/lib folder. Copying libs to right folder makes them available at runtime.

This is required if you are using eclipse to build and deploy your project.

Cyme answered 17/9, 2015 at 19:14 Comment(0)
S
0

In pom.xml file we need to add

<dependency>
    <groupId>com.sun.jersey</groupId>
    <artifactId>jersey-core</artifactId>
    <version>1.8</version>
</dependency>
Skeg answered 31/8, 2017 at 12:5 Comment(0)
A
0

The same error and wasted 2+ hours debugging and trying all options. I was not using the Maven/POM, so I could not leverage that solution given by few.

Finally the following resolved it: Adding the jars directly to the tomcat/lib (NOT WEB-INF\lib) folder and restarting the tomcat.

Alameda answered 13/12, 2017 at 0:24 Comment(0)
S
0

If anyone is trying to build a hello world application using Jersey, I think one of the easiest ways is to follow Jersey documentation.

https://jersey.github.io/download.html

If you are already using maven, it'd take only a few minutes to see the result.

I used below.

mvn archetype:generate -DarchetypeGroupId=org.glassfish.jersey.archetypes -DarchetypeArtifactId=jersey-quickstart-webapp -DarchetypeVersion=2.26
Stumpage answered 19/12, 2017 at 2:26 Comment(0)
S
0

It basically depends on which version jersey you are using. If you are using Jersey ver.1.X.X you need to add

Jersey 1 uses "com.sun.jersey", and Jersey 2 uses org.glassfish. on servlet class tag. Also, note that also init-param starting with com.sun.jersey won't be recognized by Jersey 2.

And Add all the jar file into WEB-INF lib folder

Selsyn answered 5/1, 2018 at 7:56 Comment(0)
S
0

In my case, it worked after adding the jersey-bundle jar in my tomcat lib.

Sanhedrin answered 28/3, 2022 at 0:19 Comment(0)
A
-1

Add "jersey-spring" dependency in your pm file will solve the problem as it contains the required files which tomcat finds.

Avlona answered 2/11, 2023 at 12:52 Comment(1)
Your answer could be improved with additional supporting information. Please edit to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers in the help center.Winola

© 2022 - 2024 — McMap. All rights reserved.